<?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=Khotkin</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=Khotkin"/>
	<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/Khotkin"/>
	<updated>2026-10-22T18:03:26Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=20132</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=20132"/>
		<updated>2016-12-05T19:56:45Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[U:Khotkin|Хоткин Кирилл]] 623 гр., [[U:Mikhail Tsarev|Царев Михаил]] 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа m, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{2}&amp;lt;/math&amp;gt; путем вычисления только диагональных и наддиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
В ходе данной работы все вычислительные эксперименты были проведены на суперкомпьютере IBM Blue Gene/P. В суперкомпьютере насчитывается 2048 вычислительных узлов. Каждый вычислительный узел состоит из одного четырехъядерного PowerPC 450 процессора. Таким образом всего насчитывается 8192 процессорных ядер. Пиковая производительность составляет 27,9 терафлопс. На вычислительных узлах системы Blue Gene/P возможны три режима исполнения процессов: 1. режим симметричного мультипроцессора (symmetrical multiprocessing, SMP) 2. режим виртуальных вычислительных узлов (virtual node mode, VN) 3. режим двухъядерных вычислительных узлов (dual node mode, DUAL) Таким образом на вычислительном узле могут быть размещены один, четыре и два MPI процесса. В VN и DUAL режимах процессы в рамках вычислительного узла для обмена данными могут использовать механизм общей памяти. Вычислительный эксперимент проводился в режиме SMP.&lt;br /&gt;
&lt;br /&gt;
Параметрами запуска реализации алгоритма были число процессов и порядок матрицы, которые менялись в диапазонах [&amp;lt;math&amp;gt;2^0, 2^1,..., 2^i,..., 2^{10}&amp;lt;/math&amp;gt;] и [&amp;lt;math&amp;gt;2^5, 2^6,..., 2^j,..., 2^{14}&amp;lt;/math&amp;gt;] соответственно. При осуществлении реализации алгоритма на каждом узле компьютера размещалось по одному процессу, таким образом при увеличении числа процессов увеличивалось и число задействованных узлов.&lt;br /&gt;
&lt;br /&gt;
На рисунках ниже представлены графики производительности и эффективности параллелизма реализации алгоритма построения матрицы Адамара произвольного размера.&lt;br /&gt;
&lt;br /&gt;
[[file:Productivity.jpg|thumb|center|1000px|Рисунок 2. График производительности реализации алгоритма.]]&lt;br /&gt;
[[file:Parallel_efficiency.jpg|thumb|center|1000px|Рисунок 3. График эффективности параллелизма реализации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости выбранной реализации построения матрицы Адамара:&lt;br /&gt;
* По числу процессов: при увеличении числа процессов производительность увеличивается практически линейно за исключением случаев, когда обрабатываются матрицы, маленьких порядков: в таких случаях время, уходящее на синхронизацию процессов, занимает значительную долю от общего времени построения матрицы. Эффективность параллелизма также не улучшается при расчёте матриц маленьких порядков. При вычислении матриц Адамара больших порядков можно наблюдать, что эффективность параллелизма реализации алгоритма равна единице или близка к ней.&lt;br /&gt;
* По размеру задачи: при увеличении порядка матрицы производительность и эффективность параллелизма увеличиваются несущественно.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Примеры вычислительных пакетов, содержащих функции генерации матриц Адамара:&lt;br /&gt;
&lt;br /&gt;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Кронберг, Ю.И. Ожигов, А.Ю. Чернявский — Алгебраический аппарат квантовой информатики 2&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=20131</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=20131"/>
		<updated>2016-12-05T19:56:24Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[U:Khotkin|Хоткин Кирилл]] 623 гр., [[U:Mikhail Tsarev|Царев Михаил]] 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа m, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{2}&amp;lt;/math&amp;gt; путем вычисления только диагональных и наддиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
В ходе данной работы все вычислительные эксперименты были проведены на суперкомпьютере IBM Blue Gene/P. В суперкомпьютере насчитывается 2048 вычислительных узлов. Каждый вычислительный узел состоит из одного четырехъядерного PowerPC 450 процессора. Таким образом всего насчитывается 8192 процессорных ядер. Пиковая производительность составляет 27,9 терафлопс. На вычислительных узлах системы Blue Gene/P возможны три режима исполнения процессов: 1. режим симметричного мультипроцессора (symmetrical multiprocessing, SMP) 2. режим виртуальных вычислительных узлов (virtual node mode, VN) 3. режим двухъядерных вычислительных узлов (dual node mode, DUAL) Таким образом на вычислительном узле могут быть размещены один, четыре и два MPI процесса. В VN и DUAL режимах процессы в рамках вычислительного узла для обмена данными могут использовать механизм общей памяти. Вычислительный эксперимент проводился в режиме SMP.&lt;br /&gt;
&lt;br /&gt;
Параметрами запуска реализации алгоритма были число процессов и порядок матрицы, которые менялись в диапазонах [&amp;lt;math&amp;gt;2^0, 2^1,..., 2^i,..., 2^{10}&amp;lt;/math&amp;gt;] и [&amp;lt;math&amp;gt;2^5, 2^6,..., 2^j,..., 2^{14}&amp;lt;/math&amp;gt;] соответственно. При осуществлении реализации алгоритма на каждом узле компьютера размещалось по одному процессу, таким образом при увеличении числа процессов увеличивалось и число задействованных узлов.&lt;br /&gt;
&lt;br /&gt;
На рисунках ниже представлены графики производительности и эффективности параллелизма реализации алгоритма построения матрицы Адамара произвольного размера.&lt;br /&gt;
&lt;br /&gt;
[[file:Productivity.jpg|thumb|center|1000px|Рисунок 2. График производительности реализации алгоритма.]]&lt;br /&gt;
[[file:Parallel_efficiency.jpg|thumb|center|1000px|Рисунок 3. График эффективности параллелизма реализации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости выбранной реализации построения матрицы Адамара:&lt;br /&gt;
* По числу процессов: при увеличении числа процессов производительность увеличивается практически линейно за исключением случаев, когда обрабатываются матрицы, маленьких порядков: в таких случаях время, уходящее на синхронизацию процессов, занимает значительную долю от общего времени построения матрицы. Эффективность параллелизма также не улучшается при расчёте матриц маленьких порядков. При вычислении матриц Адамара больших порядков можно наблюдать, что эффективность параллелизма реализации алгоритма равна единице или близка к ней.&lt;br /&gt;
* По размеру задачи: при увеличении порядка матрицы производительность и эффективность параллелизма увеличиваются несущественно.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Примеры вычислительных пакетов, содержащих функции генерации матриц Адамара:&lt;br /&gt;
&lt;br /&gt;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Кронберг, Ю.И. Ожигов, А.Ю. Чернявский — Алгебраический аппарат квантовой информатики 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=20130</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=20130"/>
		<updated>2016-12-05T19:53:55Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[U:Khotkin|Хоткин Кирилл]] 623 гр., [[U:Mikhail Tsarev|Царев Михаил]] 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа m, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{2}&amp;lt;/math&amp;gt; путем вычисления только диагональных и наддиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
В ходе данной работы все вычислительные эксперименты были проведены на суперкомпьютере IBM Blue Gene/P. В суперкомпьютере насчитывается 2048 вычислительных узлов. Каждый вычислительный узел состоит из одного четырехъядерного PowerPC 450 процессора. Таким образом всего насчитывается 8192 процессорных ядер. Пиковая производительность составляет 27,9 терафлопс. На вычислительных узлах системы Blue Gene/P возможны три режима исполнения процессов: 1. режим симметричного мультипроцессора (symmetrical multiprocessing, SMP) 2. режим виртуальных вычислительных узлов (virtual node mode, VN) 3. режим двухъядерных вычислительных узлов (dual node mode, DUAL) Таким образом на вычислительном узле могут быть размещены один, четыре и два MPI процесса. В VN и DUAL режимах процессы в рамках вычислительного узла для обмена данными могут использовать механизм общей памяти. Вычислительный эксперимент проводился в режиме SMP.&lt;br /&gt;
&lt;br /&gt;
Параметрами запуска реализации алгоритма были число процессов и порядок матрицы, которые менялись в диапазонах [&amp;lt;math&amp;gt;2^0, 2^1,..., 2^i,..., 2^{10}&amp;lt;/math&amp;gt;] и [&amp;lt;math&amp;gt;2^5, 2^6,..., 2^j,..., 2^{14}&amp;lt;/math&amp;gt;] соответственно. При осуществлении реализации алгоритма на каждом узле компьютера размещалось по одному процессу, таким образом при увеличении числа процессов увеличивалось и число задействованных узлов.&lt;br /&gt;
&lt;br /&gt;
На рисунках ниже представлены графики производительности и эффективности параллелизма реализации алгоритма построения матрицы Адамара произвольного размера.&lt;br /&gt;
&lt;br /&gt;
[[file:Productivity.jpg|thumb|center|1000px|Рисунок 2. График производительности реализации алгоритма.]]&lt;br /&gt;
[[file:Parallel_efficiency.jpg|thumb|center|1000px|Рисунок 3. График эффективности параллелизма реализации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости выбранной реализации построения матрицы Адамара:&lt;br /&gt;
* По числу процессов: при увеличении числа процессов производительность увеличивается практически линейно за исключением случаев, когда обрабатываются матрицы, маленьких порядков: в таких случаях время, уходящее на синхронизацию процессов, занимает значительную долю от общего времени построения матрицы. Эффективность параллелизма также не улучшается при расчёте матриц маленьких порядков. При вычислении матриц Адамара больших порядков можно наблюдать, что эффективность параллелизма реализации алгоритма равна единице или близка к ней.&lt;br /&gt;
* По размеру задачи: при увеличении порядка матрицы производительность и эффективность параллелизма увеличиваются несущественно.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Примеры вычислительных пакетов, содержащих функции генерации матриц Адамара:&lt;br /&gt;
&lt;br /&gt;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Кронберг, Ю.И. Ожигов, А.Ю. Чернявский — Алгебраический аппарат квантовой информатики 2&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19985</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19985"/>
		<updated>2016-12-03T19:21:11Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[U:Khotkin|Хоткин Кирилл]] 623 гр., [[U:Mikhail Tsarev|Царев Михаил]] 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа m, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{2}&amp;lt;/math&amp;gt; путем вычисления только диагональных и наддиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
В ходе данной работы все вычислительные эксперименты были проведены на суперкомпьютере IBM Blue Gene/P. В суперкомпьютере насчитывается 2048 вычислительных узлов. Каждый вычислительный узел состоит из одного четырехъядерного PowerPC 450 процессора. Таким образом всего насчитывается 8192 процессорных ядер. Пиковая производительность составляет 27,9 терафлопс. На вычислительных узлах системы Blue Gene/P возможны три режима исполнения процессов: 1. режим симметричного мультипроцессора (symmetrical multiprocessing, SMP) 2. режим виртуальных вычислительных узлов (virtual node mode, VN) 3. режим двухъядерных вычислительных узлов (dual node mode, DUAL) Таким образом на вычислительном узле могут быть размещены один, четыре и два MPI процесса. В VN и DUAL режимах процессы в рамках вычислительного узла для обмена данными могут использовать механизм общей памяти. Вычислительный эксперимент проводился в режиме SMP.&lt;br /&gt;
&lt;br /&gt;
Параметрами запуска реализации алгоритма были число процессов и порядок матрицы, которые менялись в диапазонах [&amp;lt;math&amp;gt;2^0, 2^1,..., 2^i,..., 2^{10}&amp;lt;/math&amp;gt;] и [&amp;lt;math&amp;gt;2^5, 2^6,..., 2^j,..., 2^{14}&amp;lt;/math&amp;gt;] соответственно. При осуществлении реализации алгоритма на каждом узле компьютера размещалось по одному процессу, таким образом при увеличении числа процессов увеличивалось и число задействованных узлов.&lt;br /&gt;
&lt;br /&gt;
На рисунках ниже представлены графики производительности и эффективности параллелизма реализации алгоритма построения матрицы Адамара произвольного размера.&lt;br /&gt;
&lt;br /&gt;
[[file:Productivity.jpg|thumb|center|1000px|Рисунок 2. График производительности реализации алгоритма.]]&lt;br /&gt;
[[file:Parallel_efficiency.jpg|thumb|center|1000px|Рисунок 3. График эффективности параллелизма реализации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости выбранной реализации построения матрицы Адамара:&lt;br /&gt;
* По числу процессов: при увеличении числа процессов производительность увеличивается практически линейно за исключением случаев, когда обрабатываются матрицы, маленьких порядков: в таких случаях время, уходящее на синхронизацию процессов, занимает значительную долю от общего времени построения матрицы. Эффективность параллелизма также не улучшается при расчёте матриц маленьких порядков. При вычислении матриц Адамара больших порядков можно наблюдать, что эффективность параллелизма реализации алгоритма равна единице или близка к ней.&lt;br /&gt;
* По размеру задачи: при увеличении порядка матрицы производительность и эффективность параллелизма увеличиваются несущественно.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Примеры вычислительных пакетов, содержащих функции генерации матриц Адамара:&lt;br /&gt;
&lt;br /&gt;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19983</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19983"/>
		<updated>2016-12-03T19:03:10Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[U:Khotkin|Хоткин Кирилл]] 623 гр., [[U:Mikhail Tsarev|Царев Михаил]] 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа m, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{2}&amp;lt;/math&amp;gt; путем вычисления только диагональных и наддиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
В ходе данной работы все вычислительные эксперименты были проведены на суперкомпьютере IBM Blue Gene/P. В суперкомпьютере насчитывается 2048 вычислительных узлов. Каждый вычислительный узел состоит из одного четырехъядерного PowerPC 450 процессора. Таким образом всего насчитывается 8192 процессорных ядер. Пиковая производительность составляет 27,9 терафлопс. На вычислительных узлах системы Blue Gene/P возможны три режима исполнения процессов: 1. режим симметричного мультипроцессора (symmetrical multiprocessing, SMP) 2. режим виртуальных вычислительных узлов (virtual node mode, VN) 3. режим двухъядерных вычислительных узлов (dual node mode, DUAL) Таким образом на вычислительном узле могут быть размещены один, четыре и два MPI процесса. В VN и DUAL режимах процессы в рамках вычислительного узла для обмена данными могут использовать механизм общей памяти. Вычислительный эксперимент проводился в режиме SMP.&lt;br /&gt;
&lt;br /&gt;
Параметрами запуска реализации алгоритма были число процессов и порядок матрицы, которые менялись в диапазонах [&amp;lt;math&amp;gt;2^0, 2^1,..., 2^i,..., 2^10&amp;lt;/math&amp;gt;] и [&amp;lt;math&amp;gt;2^5, 2^6,..., 2^j,..., 2^{14}&amp;lt;/math&amp;gt;] соответственно. При осуществлении реализации алгоритма на каждом узле компьютера размещалось по одному процессу, таким образом при увеличении числа процессов увеличивалось и число задействованных узлов.&lt;br /&gt;
&lt;br /&gt;
На рисунках ниже представлены графики производительности и эффективности параллелизма реализации алгоритма построения матрицы Адамара произвольного размера.&lt;br /&gt;
&lt;br /&gt;
[[file:Productivity.jpg|thumb|center|1000px|Рисунок 2. График производительности реализации алгоритма.]]&lt;br /&gt;
[[file:Parallel_efficiency.jpg|thumb|center|1000px|Рисунок 3. График эффективности параллелизма реализации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости выбранной реализации построения матрицы Адамара:&lt;br /&gt;
* По числу процессов: при увеличении числа процессов производительность увеличивается практически линейно за исключением случаев, когда обрабатываются матрицы, маленьких порядков: в таких случаях время, уходящее на синхронизацию процессов, занимает значительную долю от общего времени построения матрицы. Эффективность параллелизма также не улучшается при расчёте матриц маленьких порядков. При вычислении матриц Адамара больших порядков можно наблюдать, что эффективность параллелизма реализации алгоритма равна единице или близка к ней.&lt;br /&gt;
* По размеру задачи: при увеличении порядка матрицы производительность и эффективность параллелизма увеличиваются несущественно.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Примеры вычислительных пакетов, содержащих функции генерации матриц Адамара:&lt;br /&gt;
&lt;br /&gt;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19982</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19982"/>
		<updated>2016-12-03T14:07:55Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[U:Khotkin|Хоткин Кирилл]] 623 гр., [[U:Mikhail Tsarev|Царев Михаил]] 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа m, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{2}&amp;lt;/math&amp;gt; путем вычисления только диагональных и наддиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
В ходе данной работы все вычислительные эксперименты были проведены на суперкомпьютере IBM Blue Gene/P. В суперкомпьютере насчитывается всего 2048 вычислительных узлов. Каждый вычислительный узел состоит из одного четырехъядерного PowerPC 450 процессора. Таким образом всего насчитывается 8192 процессорных ядер. Пиковая производительность составляет 27,9 терафлопс. На вычислительных узлах системы Blue Gene/P возможны три режима исполнения процессов: 1. режим симметричного мультипроцессора (symmetrical multiprocessing, SMP) 2. режим виртуальных вычислительных узлов (virtual node mode, VN) 3. режим двухъядерных вычислительных узлов (dual node mode, DUAL) Таким образом на вычислительном узле могут быть размещены один, четыре и два MPI процесса. В VN и DUAL режимах процессы в рамках вычислительного узла для обмена данными могут использовать механизм общей памяти.&lt;br /&gt;
&lt;br /&gt;
Параметрами запуска реализации алгоритма были число процессов и порядок матрицы, которые менялись в диапазонах [&amp;lt;math&amp;gt;2^0, 2^1,..., 2^i,..., 2^8&amp;lt;/math&amp;gt;] и [&amp;lt;math&amp;gt;2^5, 2^6,..., 2^j,..., 2^{14}&amp;lt;/math&amp;gt;] соответственно. При осуществлении реализации алгоритма на каждом узле компьютера размещалось по одному процессу, таким образом при увеличении числа процессов увеличивалось и число задействованных узлов.&lt;br /&gt;
&lt;br /&gt;
На рисунках ниже представлены графики производительности и эффективности параллелизма реализации алгоритма построения матрицы Адамара произвольного размера.&lt;br /&gt;
&lt;br /&gt;
[[file:Productivity.jpg|thumb|center|1000px|Рисунок 2. График производительности реализации алгоритма.]]&lt;br /&gt;
[[file:Parallel_efficiency.jpg|thumb|center|1000px|Рисунок 3. График эффективности параллелизма реализации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости выбранной реализации построения матрицы Адамара:&lt;br /&gt;
* По числу процессов: при увеличении числа процессов производительность увеличивается практически линейно за исключением случаев, когда обрабатываются матрицы, маленьких порядков: в таких случаях время, уходящее на синхронизацию процессов, занимает значительную долю от общего времени построения матрицы. Эффективность параллелизма также не улучшается при расчёте матриц маленьких порядков. При вычислении матриц Адамара больших порядков можно наблюдать, что эффективность параллелизма реализации алгоритма равна единице или близка к ней.&lt;br /&gt;
* По размеру задачи: при увеличении порядка матрицы производительность и эффективность параллелизма увеличиваются несущественно.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Примеры вычислительных пакетов, содержащих функции генерации матриц Адамара:&lt;br /&gt;
&lt;br /&gt;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19981</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19981"/>
		<updated>2016-12-03T14:07:04Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[U:Khotkin|Хоткин Кирилл]] 623 гр., [[U:Mikhail Tsarev|Царев Михаил]] 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа m, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{2}&amp;lt;/math&amp;gt; путем вычисления только диагональных и наддиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
В ходе данной работы все вычислительные эксперименты были проведены на суперкомпьютере IBM Blue Gene/P. В суперкомпьютере насчитывается всего 2048 вычислительных узлов. Каждый вычислительный узел состоит из одного четырехъядерного PowerPC 450 процессора. Таким образом всего насчитывается 8192 процессорных ядер. Пиковая производительность составляет 27,9 терафлопс. На вычислительных узлах системы Blue Gene/P возможны три режима исполнения процессов: 1. режим симметричного мультипроцессора (symmetrical multiprocessing, SMP) 2. режим виртуальных вычислительных узлов (virtual node mode, VN) 3. режим двухъядерных вычислительных узлов (dual node mode, DUAL) Таким образом на вычислительном узле могут быть размещены один, четыре и два MPI процесса. В VN и DUAL режимах процессы в рамках вычислительного узла для обмена данными могут использовать механизм общей памяти.&lt;br /&gt;
&lt;br /&gt;
Параметрами запуска реализации алгоритма были число процессов и порядок матрицы, которые менялись в диапазонах [&amp;lt;math&amp;gt;2^0, 2^1,..., 2^i,..., 2^8&amp;lt;/math&amp;gt;] и [&amp;lt;math&amp;gt;2^5, 2^6,..., 2^j,..., 2^{14}&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;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Khotkin</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:Parallel_efficiency.jpg&amp;diff=19980</id>
		<title>Файл:Parallel efficiency.jpg</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:Parallel_efficiency.jpg&amp;diff=19980"/>
		<updated>2016-12-03T14:05:47Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: Khotkin загрузил новую версию Файл:Parallel efficiency.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Khotkin</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:Productivity.jpg&amp;diff=19979</id>
		<title>Файл:Productivity.jpg</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:Productivity.jpg&amp;diff=19979"/>
		<updated>2016-12-03T14:05:05Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: Khotkin загрузил новую версию Файл:Productivity.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19261</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19261"/>
		<updated>2016-11-26T21:58:18Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[U:Khotkin|Хоткин Кирилл]] 623 гр., [[U:Mikhail Tsarev|Царев Михаил]] 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа m, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{2}&amp;lt;/math&amp;gt; путем вычисления только диагональных и наддиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
В ходе данной работы все вычислительные эксперименты были проведены на суперкомпьютере IBM Blue Gene/P. В суперкомпьютере насчитывается всего 2048 вычислительных узлов. Каждый вычислительный узел состоит из одного четырехъядерного PowerPC 450 процессора. Таким образом всего насчитывается 8192 процессорных ядер. Пиковая производительность составляет 27,9 терафлопс. На вычислительных узлах системы Blue Gene/P возможны три режима исполнения процессов: 1. режим симметричного мультипроцессора (symmetrical multiprocessing, SMP) 2. режим виртуальных вычислительных узлов (virtual node mode, VN) 3. режим двухъядерных вычислительных узлов (dual node mode, DUAL) Таким образом на вычислительном узле могут быть размещены один, четыре и два MPI процесса. В VN и DUAL режимах процессы в рамках вычислительного узла для обмена данными могут использовать механизм общей памяти.&lt;br /&gt;
&lt;br /&gt;
Параметрами запуска реализации алгоритма были число процессов и порядок матрицы, которые менялись в диапазонах [&amp;lt;math&amp;gt;2^0, 2^1,..., 2^i,..., 2^8&amp;lt;/math&amp;gt;] и [&amp;lt;math&amp;gt;2^5, 2^6,..., 2^j,..., 2^{14}&amp;lt;/math&amp;gt;] соответственно. При осуществлении реализации алгоритма на каждом узле компьютера размещалось по одному процессу, таким образом при увеличении числа процессов увеличивалось и число задействованных узлов.&lt;br /&gt;
&lt;br /&gt;
На рисунках ниже представлены графики производительности и эффективности параллелизма реализации алгоритма построения матрицы Адамара произвольного размера.&lt;br /&gt;
&lt;br /&gt;
[[file:Productivity.jpg|thumb|center|1000px|Рисунок 2. График производительности реализации алгоритма.]]&lt;br /&gt;
[[file:Parallel efficiency.jpg|thumb|center|1000px|Рисунок 3. График эффективности параллелизма реализации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости выбранной реализации построения матрицы Адамара:&lt;br /&gt;
* По числу процессов: при увеличении числа процессов производительность увеличивается практически линейно за исключением случаев, когда обрабатываются матрицы, маленьких порядков: в таких случаях время, уходящее на синхронизацию процессов, занимает значительную долю от общего времени построения матрицы. Эффективность параллелизма также не улучшается при расчёте матриц маленьких порядков. При вычислении матриц Адамара больших порядков можно наблюдать, что эффективность параллелизма реализации алгоритма равна единице или близка к ней.&lt;br /&gt;
* По размеру задачи: при увеличении порядка матрицы производительность и эффективность параллелизма увеличиваются несущественно.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Примеры вычислительных пакетов, содержащих функции генерации матриц Адамара:&lt;br /&gt;
&lt;br /&gt;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19260</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19260"/>
		<updated>2016-11-26T21:44:01Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[U:Khotkin|Хоткин Кирилл]] 623 гр., [[U:Mikhail Tsarev|Царев Михаил]] 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа m, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{2}&amp;lt;/math&amp;gt; путем вычисления только диагональных и наддиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
В ходе данной работы все вычислительные эксперименты были проведены на суперкомпьютере IBM Blue Gene/P. В суперкомпьютере насчитывается всего 2048 вычислительных узлов. Каждый вычислительный узел состоит из одного четырехъядерного PowerPC 450 процессора. Таким образом всего насчитывается 8192 процессорных ядер. Пиковая производительность составляет 27,9 терафлопс. На вычислительных узлах системы Blue Gene/P возможны три режима исполнения процессов: 1. режим симметричного мультипроцессора (symmetrical multiprocessing, SMP) 2. режим виртуальных вычислительных узлов (virtual node mode, VN) 3. режим двухъядерных вычислительных узлов (dual node mode, DUAL) Таким образом на вычислительном узле могут быть размещены один, четыре и два MPI процесса. В VN и DUAL режимах процессы в рамках вычислительного узла для обмена данными могут использовать механизм общей памяти.&lt;br /&gt;
&lt;br /&gt;
Параметрами запуска реализации алгоритма были число процессов и порядок матрицы, которые менялись в диапазонах [&amp;lt;math&amp;gt;2^0, 2^1,..., 2^i,..., 2^8&amp;lt;/math&amp;gt;] и [&amp;lt;math&amp;gt;2^5, 2^6,..., 2^j,..., 2^{14}&amp;lt;/math&amp;gt;] соответственно. При осуществлении реализации алгоритма на каждом узле компьютера размещалось по одному процессу, таким образом при увеличении числа процессов увеличивалось и число задействованных узлов.&lt;br /&gt;
&lt;br /&gt;
На рисунках ниже представлены графики производительности и эффективности параллелизма реализации алгоритма построения матрицы Адамара произвольного размера.&lt;br /&gt;
&lt;br /&gt;
[[file:Productivity.jpg|thumb|center|1000px|Рисунок 2. График производительности реализации алгоритма.]]&lt;br /&gt;
[[file:Parallel efficiency.jpg|thumb|center|1000px|Рисунок 3. График эффективности параллелизма реализации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости выбранной реализации построения матрицы Адамара:&lt;br /&gt;
* По числу процессов: при увеличении числа процессов производительность увеличивается практически линейно за исключением случаев, когда обрабатываются матрицы, маленьких порядков: в таких случаях не все процессы оказываются загруженными, а потому не увеличивают производительность реализации. Эффективность параллелизма также не улучшается при расчёте матриц маленьких порядков, так как простаивающие процессы не придают реализации должного ускорения. При вычислении матриц Адамара больших порядков можно наблюдать, что эффективность параллелизма реализации алгоритма равна единице или близка к ней.&lt;br /&gt;
* По размеру задачи: при увеличении порядка матрицы производительность и эффективность параллелизма увеличиваются несущественно.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Примеры вычислительных пакетов, содержащих функции генерации матриц Адамара:&lt;br /&gt;
&lt;br /&gt;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19259</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19259"/>
		<updated>2016-11-26T21:43:42Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[U:Khotkin|Хоткин Кирилл]] 623 гр., [[U:Mikhail Tsarev|Царев Михаил]] 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа m, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{2}&amp;lt;/math&amp;gt; путем вычисления только диагональных и наддиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
В ходе данной работы все вычислительные эксперименты были проведены на суперкомпьютере IBM Blue Gene/P. В суперкомпьютере насчитывается всего 2048 вычислительных узлов. Каждый вычислительный узел состоит из одного четырехъядерного PowerPC 450 процессора. Таким образом всего насчитывается 8192 процессорных ядер. Пиковая производительность составляет 27,9 терафлопс. На вычислительных узлах системы Blue Gene/P возможны три режима исполнения процессов: 1. режим симметричного мультипроцессора (symmetrical multiprocessing, SMP) 2. режим виртуальных вычислительных узлов (virtual node mode, VN) 3. режим двухъядерных вычислительных узлов (dual node mode, DUAL) Таким образом на вычислительном узле могут быть размещены один, четыре и два MPI процесса. В VN и DUAL режимах процессы в рамках вычислительного узла для обмена данными могут использовать механизм общей памяти.&lt;br /&gt;
&lt;br /&gt;
Параметрами запуска реализации алгоритма были число процессов и порядок матрицы, которые менялись в диапазонах [&amp;lt;math&amp;gt;2^0, 2^1,..., 2^i,..., 2^8&amp;lt;/math&amp;gt;] и [&amp;lt;math&amp;gt;2^5, 2^6,..., 2^j,..., 2^14&amp;lt;/math&amp;gt;] соответственно. При осуществлении реализации алгоритма на каждом узле компьютера размещалось по одному процессу, таким образом при увеличении числа процессов увеличивалось и число задействованных узлов.&lt;br /&gt;
&lt;br /&gt;
На рисунках ниже представлены графики производительности и эффективности параллелизма реализации алгоритма построения матрицы Адамара произвольного размера.&lt;br /&gt;
&lt;br /&gt;
[[file:Productivity.jpg|thumb|center|1000px|Рисунок 2. График производительности реализации алгоритма.]]&lt;br /&gt;
[[file:Parallel efficiency.jpg|thumb|center|1000px|Рисунок 3. График эффективности параллелизма реализации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости выбранной реализации построения матрицы Адамара:&lt;br /&gt;
* По числу процессов: при увеличении числа процессов производительность увеличивается практически линейно за исключением случаев, когда обрабатываются матрицы, маленьких порядков: в таких случаях не все процессы оказываются загруженными, а потому не увеличивают производительность реализации. Эффективность параллелизма также не улучшается при расчёте матриц маленьких порядков, так как простаивающие процессы не придают реализации должного ускорения. При вычислении матриц Адамара больших порядков можно наблюдать, что эффективность параллелизма реализации алгоритма равна единице или близка к ней.&lt;br /&gt;
* По размеру задачи: при увеличении порядка матрицы производительность и эффективность параллелизма увеличиваются несущественно.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Примеры вычислительных пакетов, содержащих функции генерации матриц Адамара:&lt;br /&gt;
&lt;br /&gt;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19258</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19258"/>
		<updated>2016-11-26T21:08:26Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[U:Khotkin|Хоткин Кирилл]] 623 гр., [[U:Mikhail Tsarev|Царев Михаил]] 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа m, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{2}&amp;lt;/math&amp;gt; путем вычисления только диагональных и наддиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
В ходе данной работы все вычислительные эксперименты были проведены на суперкомпьютере IBM Blue Gene/P. В суперкомпьютере насчитывается всего 2048 вычислительных узлов. Каждый вычислительный узел состоит из одного четырехъядерного PowerPC 450 процессора. Таким образом всего насчитывается 8192 процессорных ядер. Пиковая производительность составляет 27,9 терафлопс. На вычислительных узлах системы Blue Gene/P возможны три режима исполнения процессов: 1. режим симметричного мультипроцессора (symmetrical multiprocessing, SMP) 2. режим виртуальных вычислительных узлов (virtual node mode, VN) 3. режим двухъядерных вычислительных узлов (dual node mode, DUAL) Таким образом на вычислительном узле могут быть размещены один, четыре и два MPI процесса. В VN и DUAL режимах процессы в рамках вычислительного узла для обмена данными могут использовать механизм общей памяти.&lt;br /&gt;
&lt;br /&gt;
Параметрами запуска реализации алгоритма были число процессов и порядок матрицы, которые менялись в диапазонах [2^0, 2^1,..., 2^i,..., 2^8] и [2^5, 2^6,..., 2^j,..., 2^14] соответственно. При осуществлении реализации алгоритма на каждом узле компьютера размещалось по одному процессу, таким образом при увеличении числа процессов увеличивалось и число задействованных узлов.&lt;br /&gt;
&lt;br /&gt;
На рисунках ниже представлены графики производительности и эффективности параллелизма реализации алгоритма построения матрицы Адамара произвольного размера.&lt;br /&gt;
&lt;br /&gt;
[[file:Productivity.jpg|thumb|center|1000px|Рисунок 2. График производительности реализации алгоритма.]]&lt;br /&gt;
[[file:Parallel efficiency.jpg|thumb|center|1000px|Рисунок 3. График эффективности параллелизма реализации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости выбранной реализации построения матрицы Адамара:&lt;br /&gt;
* По числу процессов: при увеличении числа процессов производительность увеличивается практически линейно за исключением случаев, когда обрабатываются матрицы, маленьких порядков: в таких случаях не все процессы оказываются загруженными, а потому не увеличивают производительность реализации. Эффективность параллелизма также не улучшается при расчёте матриц маленьких порядков, так как простаивающие процессы не придают реализации должного ускорения. При вычислении матриц Адамара больших порядков можно наблюдать, что эффективность параллелизма реализации алгоритма равна единице или близка к ней.&lt;br /&gt;
* По размеру задачи: при увеличении порядка матрицы производительность и эффективность параллелизма увеличиваются несущественно.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Примеры вычислительных пакетов, содержащих функции генерации матриц Адамара:&lt;br /&gt;
&lt;br /&gt;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Khotkin</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:Productivity.jpg&amp;diff=19257</id>
		<title>Файл:Productivity.jpg</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:Productivity.jpg&amp;diff=19257"/>
		<updated>2016-11-26T21:01:06Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Khotkin</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:Parallel_efficiency.jpg&amp;diff=19256</id>
		<title>Файл:Parallel efficiency.jpg</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:Parallel_efficiency.jpg&amp;diff=19256"/>
		<updated>2016-11-26T21:00:42Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19255</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19255"/>
		<updated>2016-11-26T20:37:33Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[U:Khotkin|Хоткин Кирилл]] 623 гр., [[U:Mikhail Tsarev|Царев Михаил]] 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа m, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{2}&amp;lt;/math&amp;gt; путем вычисления только диагональных и наддиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Параметрами запуска реализации алгоритма были число процессов и порядок матрицы, которые менялись в диапазонах [2^0, 2^1,..., 2^i,..., 2^8] и [2^5, 2^6,..., 2^j,..., 2^14] соответственно.&lt;br /&gt;
&lt;br /&gt;
На рисунках ниже представлены графики производительности и эффективности параллелизма реализации алгоритма построения матрицы Адамара произвольного размера.&lt;br /&gt;
&lt;br /&gt;
[[file:Productivity.jpg|thumb|center|1000px|Рисунок 2. График производительности реализации алгоритма.]]&lt;br /&gt;
[[file:Parallel efficiency.jpg|thumb|center|1000px|Рисунок 3. График эффективности параллелизма реализации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости выбранной реализации построения матрицы Адамара:&lt;br /&gt;
* По числу процессов: при увеличении числа процессов производительность увеличивается практически линейно за исключением случаев, когда обрабатываются матрицы, маленьких порядков: в таких случаях не все процессы оказываются загруженными, а потому не увеличивают производительность реализации. Эффективность параллелизма также не улучшается при расчёте матриц маленьких порядков, так как простаивающие процессы не придают реализации должного ускорения. При вычислении матриц Адамара больших порядков можно наблюдать, что эффективность параллелизма реализации алгоритма равна единице или близка к ней.&lt;br /&gt;
* По размеру задачи: при увеличении порядка матрицы производительность и эффективность параллелизма увеличиваются несущественно.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Примеры вычислительных пакетов, содержащих функции генерации матриц Адамара:&lt;br /&gt;
&lt;br /&gt;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19250</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=19250"/>
		<updated>2016-11-26T20:18:34Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[U:Khotkin|Хоткин Кирилл]] 623 гр., [[U:Mikhail Tsarev|Царев Михаил]] 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа m, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;m&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{2}&amp;lt;/math&amp;gt; путем вычисления только диагональных и наддиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Параметрами запуска реализации алгоритма были число процессоров и размерность матрицы, которые менялись в диапазонах [2^0, 2^1,..., 2^i,..., 2^8] и [2^5, 2^6,..., 2^j,..., 2^14] соответственно.&lt;br /&gt;
&lt;br /&gt;
На рисунках ниже представлены графики производительности и эффективности параллелизма реализации алгоритма построения матрицы Адамара произвольного размера.&lt;br /&gt;
&lt;br /&gt;
[[file:Productivity.jpg|thumb|center|1400px|Рисунок 2. График производительности реализации алгоритма.]]&lt;br /&gt;
[[file:Parallel efficiency.jpg|thumb|center|1400px|Рисунок 3. График эффективности параллелизма реализации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Примеры вычислительных пакетов, содержащих функции генерации матриц Адамара:&lt;br /&gt;
&lt;br /&gt;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=12063</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=12063"/>
		<updated>2016-10-15T20:59:27Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: Хоткин Кирилл 623 гр., Царев Михаил 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа n, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;n&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;n&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{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;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=12059</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=12059"/>
		<updated>2016-10-15T20:58:50Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: Хоткин Кирилл 623 гр., Царев Михаил 615 гр.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\, \approx 3m+3.&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;недетерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа n, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;n&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;n&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара является &#039;&#039;несбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\operatorname{mod}s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{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;
# [http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter5/hadamard.asp MATLAB];&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/HadamardMatrix.html WOLFRAM];&lt;br /&gt;
# [http://pydoc.net/Python/rogues/0.3.0/rogues.matrices.hadamard/ Python];&lt;br /&gt;
# [http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_97.html Octave];&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что во многих вычислительных пакетах встроена операция тензорного произведения матриц, которая позволяет строить матрицу Адамара по определению. Этот факт позволяет использовать матрицу Адамара в этих вычислительных пакетах: &lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Maple MAPLE];&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Mathcad MATCATH];&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=11944</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=11944"/>
		<updated>2016-10-15T20:47:07Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;еееее&lt;br /&gt;
Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(m2^{2m})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(2^{2n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&amp;lt;/math&amp;gt;, где знак &amp;lt;math&amp;gt; \otimes &amp;lt;/math&amp;gt; означает тензорное произведение.&lt;br /&gt;
&lt;br /&gt;
Также существует недоказанная гипотеза Адамара, которая утверждает, что существуют матрицы Адамара порядка &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt; для любого натурального &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, однако матрица Адамара порядка &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;  до сих пор не построена, как и для ряда других порядков больше &amp;lt;math&amp;gt;268&amp;lt;/math&amp;gt;. Поэтому в данной работе будут рассматриваться матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Описанные ранее способы построения матрицы Адамара не являются оптимальными, поэтому вычисление матрицы Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; будет производится поэлементно с помощью следующей формулы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\&amp;amp; - &amp;lt;/math&amp;gt; побитовая операция И,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(i \&amp;amp; j)_k - &amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; -ый разряд в двоичном представлении числа &amp;lt;math&amp;gt;(i \&amp;amp; j)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление элементов матрицы Адамара:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
(H_m)_{ij}=(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как и в описании ядра алгоритма, основной частью алгоритма является вычисления очередного элемента матрицы Адамара с помощью следующего выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(-1)^ {\sum_{k}{(i \&amp;amp; j)_k}}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Для вычисления очередного элемента матрицы Адамара нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
1.  Побитовое умножение &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt;result = i \&amp;amp; j &amp;lt;/math&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
2. Нахождение числа единиц в двоичной записи числа &amp;lt;math&amp;gt;result &amp;lt;/math&amp;gt;:  &amp;lt;math&amp;gt; sum = \sum_{k}{(result)_k} &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Нахождение элемента матрицы Адамара: &amp;lt;math&amp;gt;(H_m)_{ij}=(-1)^{sum}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Возможная реализация на языке C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int get_sign(unsigned N) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; N; N&amp;gt;&amp;gt;=1) { i+=N&amp;amp;1;}&lt;br /&gt;
    return (i&amp;amp;1) ? -1 : 1;&lt;br /&gt;
}&lt;br /&gt;
void adamar(int **e, int size) {&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        for (unsigned int j = 0; j &amp;lt; size; ++j)&lt;br /&gt;
            e[i][j]=get_sign(i&amp;amp;j);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения первого шага алгоритма для всех элементов матрицы Адамара необходимо суммарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения.&lt;br /&gt;
На втором шаге алгоритма необходимо выполнить для каждого элемента матрицы Адамара:&lt;br /&gt;
* от 0 до m или m логических сдвигов на один бит в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций сложения в зависимости от программной реализации;&lt;br /&gt;
* от 0 до m или m операций логического умножения в зависимости от программной реализации.&lt;br /&gt;
На третьем шаге для всех элементов необходимо сумарно выполнить:&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций побитового умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&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;(m+2)2^{2m}&amp;lt;/math&amp;gt; операций логического умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций сложения;&lt;br /&gt;
* &amp;lt;math&amp;gt;m\cdot2^{2m}&amp;lt;/math&amp;gt; операций логического сдвига на один бит;&lt;br /&gt;
* &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt; операций сравнения с нулем.&lt;br /&gt;
Всего  &amp;lt;math&amp;gt;(3m+3)2^{2m}&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;amp;j&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* NoO (number of ones) - вычисление количества единиц числа в двоичной системе. Состоит из последовательного применения операций сложения и побитового умножения;&lt;br /&gt;
* Sign - определение знака соответствующего элемента. Если результат предыдущего шага - чётное число, то знак положительный, иначе - отрицательный.  &lt;br /&gt;
&lt;br /&gt;
[[File:Hadamar matrix.png|thumb|center|1400px|Рисунок 1. Граф алгоритма построения матрицы Адамара.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Вычисление любого элемента можно производить независимо от других, то есть параллельно.&lt;br /&gt;
&lt;br /&gt;
Высота канонической ярусно-параллельной формы равна 3.&lt;br /&gt;
Ширина ЯПФ равна &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: m - размерность матрицы &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число m).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{m}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{2m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм построения матрицы Адамара является &#039;&#039;не детерминированным&#039;&#039;, так как число операций меняется в зависимости от входных данных (числа n, которое формирует матрицу размерности 2&amp;lt;sup&amp;gt;&#039;&#039;n&#039;&#039;&amp;lt;/sup&amp;gt;&amp;amp;nbsp;&amp;amp;times;&amp;amp;nbsp;2&amp;lt;sup&amp;gt;&#039;&#039;n&#039;&#039;&amp;lt;/sup&amp;gt;);&lt;br /&gt;
* Данный алгоритм построения матрицы Адамара не является &#039;&#039;сбалансированным&#039;&#039;. Так как каждый элемент матрицы может обрабатываться независимо от других, вычисление элементов можно распределить по процессам. В случае, когда количество элементов матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не кратно количеству процессов &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, на некоторые процессы ложится дополнительная задача вычисления элементов матрицы в количестве &amp;lt;math&amp;gt;a=n\mod s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{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;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%B2%D0%B3%D0%B5%D0%BD%D0%B8%D0%B9_%D0%A0%D0%B0%D0%B5%D0%B2/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=11832</id>
		<title>Участник:Евгений Раев/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%B2%D0%B3%D0%B5%D0%BD%D0%B8%D0%B9_%D0%A0%D0%B0%D0%B5%D0%B2/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=11832"/>
		<updated>2016-10-15T20:35:03Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Особенности реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара произвольного размера&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;(2^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;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; — это квадратная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;, составленная из чисел 1 и −1, столбцы которой ортогональны, так что справедливо соотношение &lt;br /&gt;
: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;. Матрицы Адамара применяются в различных областях, включая комбинаторику, численный анализ, обработку сигналов.&lt;br /&gt;
&lt;br /&gt;
Матрица оператора Адамара имееет вид&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
  H = \frac{1}{\sqrt2}&lt;br /&gt;
   &amp;amp;\begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Соответственно, существует итерационная формула нахождения матриц Адамара, через тензорное произведение матрицы оператора Адамара на матрицу Адамара меньшего порядка:&lt;br /&gt;
:&amp;lt;math&amp;gt;H_n = H_{1} \otimes H_{n-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы будем использовать в дальнейшем нормализованную матрицу оператора Адамара, без коэффицента (для удобности вывода):&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
  H = &lt;br /&gt;
   &amp;amp;\begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Представим пример высчитывания матриц Адамара:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    H_{0} = 1,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    H_{1} = H_{1} \otimes H_{0} = \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix} \otimes 1 = \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    H_{2} = H_{1} \otimes H_{1} = \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix} \otimes \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix} =    \begin{pmatrix}\begin{array}{rrrr}&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp;  1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1&lt;br /&gt;
    \end{array}\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    H_{3} = H_{1} \otimes H_{2} = \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix} \otimes \begin{pmatrix}\begin{array}{rrrr}&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp;  1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1&lt;br /&gt;
    \end{array}\end{pmatrix} =    \begin{pmatrix}\begin{array}{rrrrrrrr}&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp;  1 &amp;amp;  1 &amp;amp; 1 &amp;amp;  1 &amp;amp;  1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1 &amp;amp; 1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1 &amp;amp; -1 &amp;amp; -1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp;  1 &amp;amp;  1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  -1 &amp;amp; -1 &amp;amp;  1 &amp;amp;  1 &amp;amp; -1\\&lt;br /&gt;
    \end{array}\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, получаем последовательность матриц Адамамра размерностью &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H^{\otimes n} = H_1  \otimes ... \otimes H_1&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;H_{i,j} = (-1)^{\sum i_{2 }  j_{2 }}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j_{2}&amp;lt;/math&amp;gt; - битовые представляения значений индексов, а &amp;lt;math&amp;gt;i_{2 }  j_{2 }&amp;lt;/math&amp;gt; - побитовое умножение.&lt;br /&gt;
То есть, знак элемента матрицы Адамара зависит от количества едининц в побитовом произведении индексов - если это число чётное - то знак положительный, если нечётное - отрицательный.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро расчете элементов матрицы Адамара это вычисление элемента матрицы Адамара по его индексам:&lt;br /&gt;
:&amp;lt;math&amp;gt;H_{i,j} = (-1)^{\sum i_{2 }  j_{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;
1. Определение индексов находимого элемента матрицы Адамара: &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;
2. Побитовое умножение индексов : &amp;lt;math&amp;gt;res = i_{2} j_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Подсчет количества значащих единиц в &amp;lt;math&amp;gt;res&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;count = \sum res&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4. Получение знака элемента: &amp;lt;math&amp;gt;sign = (-1)^{count}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данному алгоритму соответствует приведенный ниже код на языке С++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int get_sign(int i, int j) //Get sign Hadamard matrix&#039;s element by indices&lt;br /&gt;
{&lt;br /&gt;
    int res = i &amp;amp; j;&lt;br /&gt;
    int count;&lt;br /&gt;
    for (count=0; res; res&amp;gt;&amp;gt;=1) &lt;br /&gt;
        { &lt;br /&gt;
            if (res &amp;amp; 1)&lt;br /&gt;
                count++;&lt;br /&gt;
        }&lt;br /&gt;
    if (count &amp;amp; 1 ==1)&lt;br /&gt;
        return -1;&lt;br /&gt;
    else&lt;br /&gt;
        return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int print_HadamardMatrix(int N) //print Hadamard matrix 2^n size&lt;br /&gt;
{&lt;br /&gt;
    int matr_size(pow(2,N));&lt;br /&gt;
    for (int i = 0; i &amp;lt; matr_size; i++)&lt;br /&gt;
    {&lt;br /&gt;
        for (int j = 0; j &amp;lt; matr_size; j++) &lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            if (get_sign(i,j)==1) &lt;br /&gt;
                    cout &amp;lt;&amp;lt;&amp;quot; 1 &amp;quot;;&lt;br /&gt;
            else &lt;br /&gt;
                    cout &amp;lt;&amp;lt;&amp;quot;-1 &amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        cout &amp;lt;&amp;lt; endl;&lt;br /&gt;
    }&lt;br /&gt;
    cout &amp;lt;&amp;lt; endl;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, const char * argv[]) &lt;br /&gt;
{&lt;br /&gt;
    if(argc!=2) &lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Matrix size missing\n&amp;quot;);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    int N(atoi(argv[1]));&lt;br /&gt;
    print_HadamardMatrix(N);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Построение матрицы Адамара порядка &amp;lt;math&amp;gt;N = 2^n&amp;lt;/math&amp;gt; требует:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; побитовых умножений &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Не детерменированное значение операций для каждого элемента на шаге вычисления значащих единиц.От 2 до &amp;lt;math&amp;gt;2N&amp;lt;/math&amp;gt; операций сдвига(и, соответственно, побитовых умножений с 1) на каждый элемент.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; побитовых умножений количества значащих единиц с 1 для определения четности числа&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;
[[File:GraphHamadard.jpg|thumb|center|800px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
1. Побитовое умножение индексов.&amp;lt;math&amp;gt;i_{2}j_{2}&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{kl}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Подсчет количества значащих единиц. Состоит из последовательных сдвигов и побитового &amp;quot;И&amp;quot; с 1.&lt;br /&gt;
&lt;br /&gt;
3. Определение четности количества - побитовое &amp;quot;И&amp;quot; количества значащих единиц с 1.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для построения матрицы Адамара необходимы операции сдивга и побитового умножения. Расчет каждого элемента независим друг от друга, следовательно расчет каждого элемента будет являться параллельной ветвью. При расчете элемента все операции внутри параллельной ветви выполняются последовательно, ожидая окончания предыдущей.&lt;br /&gt;
&lt;br /&gt;
Основной вклад в высоту ярусно-параллельной формы вносит 2 шаг, осуществляющий подсчет количества значащих единиц.&lt;br /&gt;
&lt;br /&gt;
Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: n - размерность матрицы &amp;lt;math&amp;gt;H_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число n).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{n}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{n+n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является линейным.&lt;br /&gt;
&lt;br /&gt;
* Алогритм построения матрицы Адамара не является детерминированным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* [https://reference.wolframcloud.com/cloudplatform/ref/HadamardMatrix.html Wolfram]&lt;br /&gt;
* [https://www.mathworks.com/help/matlab/ref/hadamard.html?requestedDomain=www.mathworks.com MATLAB]&lt;br /&gt;
* [http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.linalg.hadamard.html SciPy]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Кронберг, Ю.И. Ожигов, А.Ю. Чернявский — Алгебраический аппарат квантовой информатики 2&lt;br /&gt;
&lt;br /&gt;
[2] Википедия – свободная энциклопедия [Электронный ресурс]. -  https://en.wikipedia.org/wiki/Hadamard_transform. - (дата обращения: 15.10.2016).&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%B2%D0%B3%D0%B5%D0%BD%D0%B8%D0%B9_%D0%A0%D0%B0%D0%B5%D0%B2/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=11829</id>
		<title>Участник:Евгений Раев/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%B2%D0%B3%D0%B5%D0%BD%D0%B8%D0%B9_%D0%A0%D0%B0%D0%B5%D0%B2/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=11829"/>
		<updated>2016-10-15T20:34:47Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Особенности реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара произвольного размера&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;(2^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;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; — это квадратная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;, составленная из чисел 1 и −1, столбцы которой ортогональны, так что справедливо соотношение &lt;br /&gt;
: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;. Матрицы Адамара применяются в различных областях, включая комбинаторику, численный анализ, обработку сигналов.&lt;br /&gt;
&lt;br /&gt;
Матрица оператора Адамара имееет вид&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
  H = \frac{1}{\sqrt2}&lt;br /&gt;
   &amp;amp;\begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Соответственно, существует итерационная формула нахождения матриц Адамара, через тензорное произведение матрицы оператора Адамара на матрицу Адамара меньшего порядка:&lt;br /&gt;
:&amp;lt;math&amp;gt;H_n = H_{1} \otimes H_{n-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы будем использовать в дальнейшем нормализованную матрицу оператора Адамара, без коэффицента (для удобности вывода):&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
  H = &lt;br /&gt;
   &amp;amp;\begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Представим пример высчитывания матриц Адамара:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    H_{0} = 1,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    H_{1} = H_{1} \otimes H_{0} = \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix} \otimes 1 = \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    H_{2} = H_{1} \otimes H_{1} = \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix} \otimes \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix} =    \begin{pmatrix}\begin{array}{rrrr}&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp;  1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1&lt;br /&gt;
    \end{array}\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    H_{3} = H_{1} \otimes H_{2} = \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix} \otimes \begin{pmatrix}\begin{array}{rrrr}&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp;  1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1&lt;br /&gt;
    \end{array}\end{pmatrix} =    \begin{pmatrix}\begin{array}{rrrrrrrr}&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp;  1 &amp;amp;  1 &amp;amp; 1 &amp;amp;  1 &amp;amp;  1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1 &amp;amp; 1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1 &amp;amp; -1 &amp;amp; -1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp;  1 &amp;amp;  1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  -1 &amp;amp; -1 &amp;amp;  1 &amp;amp;  1 &amp;amp; -1\\&lt;br /&gt;
    \end{array}\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, получаем последовательность матриц Адамамра размерностью &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H^{\otimes n} = H_1  \otimes ... \otimes H_1&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;H_{i,j} = (-1)^{\sum i_{2 }  j_{2 }}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j_{2}&amp;lt;/math&amp;gt; - битовые представляения значений индексов, а &amp;lt;math&amp;gt;i_{2 }  j_{2 }&amp;lt;/math&amp;gt; - побитовое умножение.&lt;br /&gt;
То есть, знак элемента матрицы Адамара зависит от количества едининц в побитовом произведении индексов - если это число чётное - то знак положительный, если нечётное - отрицательный.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро расчете элементов матрицы Адамара это вычисление элемента матрицы Адамара по его индексам:&lt;br /&gt;
:&amp;lt;math&amp;gt;H_{i,j} = (-1)^{\sum i_{2 }  j_{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;
1. Определение индексов находимого элемента матрицы Адамара: &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;
2. Побитовое умножение индексов : &amp;lt;math&amp;gt;res = i_{2} j_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Подсчет количества значащих единиц в &amp;lt;math&amp;gt;res&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;count = \sum res&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4. Получение знака элемента: &amp;lt;math&amp;gt;sign = (-1)^{count}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данному алгоритму соответствует приведенный ниже код на языке С++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int get_sign(int i, int j) //Get sign Hadamard matrix&#039;s element by indices&lt;br /&gt;
{&lt;br /&gt;
    int res = i &amp;amp; j;&lt;br /&gt;
    int count;&lt;br /&gt;
    for (count=0; res; res&amp;gt;&amp;gt;=1) &lt;br /&gt;
        { &lt;br /&gt;
            if (res &amp;amp; 1)&lt;br /&gt;
                count++;&lt;br /&gt;
        }&lt;br /&gt;
    if (count &amp;amp; 1 ==1)&lt;br /&gt;
        return -1;&lt;br /&gt;
    else&lt;br /&gt;
        return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int print_HadamardMatrix(int N) //print Hadamard matrix 2^n size&lt;br /&gt;
{&lt;br /&gt;
    int matr_size(pow(2,N));&lt;br /&gt;
    for (int i = 0; i &amp;lt; matr_size; i++)&lt;br /&gt;
    {&lt;br /&gt;
        for (int j = 0; j &amp;lt; matr_size; j++) &lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            if (get_sign(i,j)==1) &lt;br /&gt;
                    cout &amp;lt;&amp;lt;&amp;quot; 1 &amp;quot;;&lt;br /&gt;
            else &lt;br /&gt;
                    cout &amp;lt;&amp;lt;&amp;quot;-1 &amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        cout &amp;lt;&amp;lt; endl;&lt;br /&gt;
    }&lt;br /&gt;
    cout &amp;lt;&amp;lt; endl;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, const char * argv[]) &lt;br /&gt;
{&lt;br /&gt;
    if(argc!=2) &lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Matrix size missing\n&amp;quot;);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    int N(atoi(argv[1]));&lt;br /&gt;
    print_HadamardMatrix(N);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Построение матрицы Адамара порядка &amp;lt;math&amp;gt;N = 2^n&amp;lt;/math&amp;gt; требует:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; побитовых умножений &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Не детерменированное значение операций для каждого элемента на шаге вычисления значащих единиц.От 2 до &amp;lt;math&amp;gt;2N&amp;lt;/math&amp;gt; операций сдвига(и, соответственно, побитовых умножений с 1) на каждый элемент.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; побитовых умножений количества значащих единиц с 1 для определения четности числа&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;
[[File:GraphHamadard.jpg|thumb|center|800px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
1. Побитовое умножение индексов.&amp;lt;math&amp;gt;i_{2}j_{2}&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{kl}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Подсчет количества значащих единиц. Состоит из последовательных сдвигов и побитового &amp;quot;И&amp;quot; с 1.&lt;br /&gt;
&lt;br /&gt;
3. Определение четности количества - побитовое &amp;quot;И&amp;quot; количества значащих единиц с 1.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для построения матрицы Адамара необходимы операции сдивга и побитового умножения. Расчет каждого элемента независим друг от друга, следовательно расчет каждого элемента будет являться параллельной ветвью. При расчете элемента все операции внутри параллельной ветви выполняются последовательно, ожидая окончания предыдущей.&lt;br /&gt;
&lt;br /&gt;
Основной вклад в высоту ярусно-параллельной формы вносит 2 шаг, осуществляющий подсчет количества значащих единиц.&lt;br /&gt;
&lt;br /&gt;
Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: n - размерность матрицы &amp;lt;math&amp;gt;H_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число n).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{n}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{n+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;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно уменьшить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{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;
* [https://reference.wolframcloud.com/cloudplatform/ref/HadamardMatrix.html Wolfram]&lt;br /&gt;
* [https://www.mathworks.com/help/matlab/ref/hadamard.html?requestedDomain=www.mathworks.com MATLAB]&lt;br /&gt;
* [http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.linalg.hadamard.html SciPy]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Кронберг, Ю.И. Ожигов, А.Ю. Чернявский — Алгебраический аппарат квантовой информатики 2&lt;br /&gt;
&lt;br /&gt;
[2] Википедия – свободная энциклопедия [Электронный ресурс]. -  https://en.wikipedia.org/wiki/Hadamard_transform. - (дата обращения: 15.10.2016).&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%B2%D0%B3%D0%B5%D0%BD%D0%B8%D0%B9_%D0%A0%D0%B0%D0%B5%D0%B2/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=11824</id>
		<title>Участник:Евгений Раев/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%95%D0%B2%D0%B3%D0%B5%D0%BD%D0%B8%D0%B9_%D0%A0%D0%B0%D0%B5%D0%B2/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=11824"/>
		<updated>2016-10-15T20:34:00Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Особенности реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Построение матрицы Адамара произвольного размера&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;(2^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;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; — это квадратная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;, составленная из чисел 1 и −1, столбцы которой ортогональны, так что справедливо соотношение &lt;br /&gt;
: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;. Матрицы Адамара применяются в различных областях, включая комбинаторику, численный анализ, обработку сигналов.&lt;br /&gt;
&lt;br /&gt;
Матрица оператора Адамара имееет вид&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
  H = \frac{1}{\sqrt2}&lt;br /&gt;
   &amp;amp;\begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Соответственно, существует итерационная формула нахождения матриц Адамара, через тензорное произведение матрицы оператора Адамара на матрицу Адамара меньшего порядка:&lt;br /&gt;
:&amp;lt;math&amp;gt;H_n = H_{1} \otimes H_{n-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы будем использовать в дальнейшем нормализованную матрицу оператора Адамара, без коэффицента (для удобности вывода):&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
  H = &lt;br /&gt;
   &amp;amp;\begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Представим пример высчитывания матриц Адамара:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    H_{0} = 1,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    H_{1} = H_{1} \otimes H_{0} = \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix} \otimes 1 = \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    H_{2} = H_{1} \otimes H_{1} = \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix} \otimes \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix} =    \begin{pmatrix}\begin{array}{rrrr}&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp;  1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1&lt;br /&gt;
    \end{array}\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    H_{3} = H_{1} \otimes H_{2} = \begin{pmatrix}\begin{array}{rr}&lt;br /&gt;
    1 &amp;amp; 1\\&lt;br /&gt;
    1 &amp;amp; -1&lt;br /&gt;
   \end{array}\end{pmatrix} \otimes \begin{pmatrix}\begin{array}{rrrr}&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp;  1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1&lt;br /&gt;
    \end{array}\end{pmatrix} =    \begin{pmatrix}\begin{array}{rrrrrrrr}&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp;  1 &amp;amp;  1 &amp;amp; 1 &amp;amp;  1 &amp;amp;  1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1 &amp;amp; 1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1 &amp;amp; -1 &amp;amp; -1 &amp;amp; -1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp;  1 &amp;amp;  1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp;  1 &amp;amp; -1 &amp;amp;  1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  1 &amp;amp;  1\\&lt;br /&gt;
    1 &amp;amp; -1 &amp;amp; -1 &amp;amp;  -1 &amp;amp; -1 &amp;amp;  1 &amp;amp;  1 &amp;amp; -1\\&lt;br /&gt;
    \end{array}\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, получаем последовательность матриц Адамамра размерностью &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H^{\otimes n} = H_1  \otimes ... \otimes H_1&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;H_{i,j} = (-1)^{\sum i_{2 }  j_{2 }}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j_{2}&amp;lt;/math&amp;gt; - битовые представляения значений индексов, а &amp;lt;math&amp;gt;i_{2 }  j_{2 }&amp;lt;/math&amp;gt; - побитовое умножение.&lt;br /&gt;
То есть, знак элемента матрицы Адамара зависит от количества едининц в побитовом произведении индексов - если это число чётное - то знак положительный, если нечётное - отрицательный.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро расчете элементов матрицы Адамара это вычисление элемента матрицы Адамара по его индексам:&lt;br /&gt;
:&amp;lt;math&amp;gt;H_{i,j} = (-1)^{\sum i_{2 }  j_{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;
1. Определение индексов находимого элемента матрицы Адамара: &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;
2. Побитовое умножение индексов : &amp;lt;math&amp;gt;res = i_{2} j_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Подсчет количества значащих единиц в &amp;lt;math&amp;gt;res&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;count = \sum res&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4. Получение знака элемента: &amp;lt;math&amp;gt;sign = (-1)^{count}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данному алгоритму соответствует приведенный ниже код на языке С++:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int get_sign(int i, int j) //Get sign Hadamard matrix&#039;s element by indices&lt;br /&gt;
{&lt;br /&gt;
    int res = i &amp;amp; j;&lt;br /&gt;
    int count;&lt;br /&gt;
    for (count=0; res; res&amp;gt;&amp;gt;=1) &lt;br /&gt;
        { &lt;br /&gt;
            if (res &amp;amp; 1)&lt;br /&gt;
                count++;&lt;br /&gt;
        }&lt;br /&gt;
    if (count &amp;amp; 1 ==1)&lt;br /&gt;
        return -1;&lt;br /&gt;
    else&lt;br /&gt;
        return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int print_HadamardMatrix(int N) //print Hadamard matrix 2^n size&lt;br /&gt;
{&lt;br /&gt;
    int matr_size(pow(2,N));&lt;br /&gt;
    for (int i = 0; i &amp;lt; matr_size; i++)&lt;br /&gt;
    {&lt;br /&gt;
        for (int j = 0; j &amp;lt; matr_size; j++) &lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            if (get_sign(i,j)==1) &lt;br /&gt;
                    cout &amp;lt;&amp;lt;&amp;quot; 1 &amp;quot;;&lt;br /&gt;
            else &lt;br /&gt;
                    cout &amp;lt;&amp;lt;&amp;quot;-1 &amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        cout &amp;lt;&amp;lt; endl;&lt;br /&gt;
    }&lt;br /&gt;
    cout &amp;lt;&amp;lt; endl;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, const char * argv[]) &lt;br /&gt;
{&lt;br /&gt;
    if(argc!=2) &lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Matrix size missing\n&amp;quot;);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    int N(atoi(argv[1]));&lt;br /&gt;
    print_HadamardMatrix(N);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Построение матрицы Адамара порядка &amp;lt;math&amp;gt;N = 2^n&amp;lt;/math&amp;gt; требует:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; побитовых умножений &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Не детерменированное значение операций для каждого элемента на шаге вычисления значащих единиц.От 2 до &amp;lt;math&amp;gt;2N&amp;lt;/math&amp;gt; операций сдвига(и, соответственно, побитовых умножений с 1) на каждый элемент.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; побитовых умножений количества значащих единиц с 1 для определения четности числа&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;
[[File:GraphHamadard.jpg|thumb|center|800px|Рисунок 1. Граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
1. Побитовое умножение индексов.&amp;lt;math&amp;gt;i_{2}j_{2}&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; соответствующие координаты элемента &amp;lt;math&amp;gt;h_{kl}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Подсчет количества значащих единиц. Состоит из последовательных сдвигов и побитового &amp;quot;И&amp;quot; с 1.&lt;br /&gt;
&lt;br /&gt;
3. Определение четности количества - побитовое &amp;quot;И&amp;quot; количества значащих единиц с 1.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для построения матрицы Адамара необходимы операции сдивга и побитового умножения. Расчет каждого элемента независим друг от друга, следовательно расчет каждого элемента будет являться параллельной ветвью. При расчете элемента все операции внутри параллельной ветви выполняются последовательно, ожидая окончания предыдущей.&lt;br /&gt;
&lt;br /&gt;
Основной вклад в высоту ярусно-параллельной формы вносит 2 шаг, осуществляющий подсчет количества значащих единиц.&lt;br /&gt;
&lt;br /&gt;
Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: n - размерность матрицы &amp;lt;math&amp;gt;H_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: 1 (число n).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица Адамара &amp;lt;math&amp;gt;H_{n}&amp;lt;/math&amp;gt; размерностью &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2^{n+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;
Учитывая, что рассматриваемый алгоритм строит симметричные матрицы Адамара, можно снизить количество вычисляемых элементов c &amp;lt;math&amp;gt;2^{2n}&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{2^n+2^{2n}}{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;
* [https://reference.wolframcloud.com/cloudplatform/ref/HadamardMatrix.html Wolfram]&lt;br /&gt;
* [https://www.mathworks.com/help/matlab/ref/hadamard.html?requestedDomain=www.mathworks.com MATLAB]&lt;br /&gt;
* [http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.linalg.hadamard.html SciPy]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Кронберг, Ю.И. Ожигов, А.Ю. Чернявский — Алгебраический аппарат квантовой информатики 2&lt;br /&gt;
&lt;br /&gt;
[2] Википедия – свободная энциклопедия [Электронный ресурс]. -  https://en.wikipedia.org/wiki/Hadamard_transform. - (дата обращения: 15.10.2016).&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10597</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10597"/>
		<updated>2016-10-15T16:46:28Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: Содержимое страницы заменено на «___»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;___&lt;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10535</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10535"/>
		<updated>2016-10-15T16:34:40Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10533</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10533"/>
		<updated>2016-10-15T16:34:08Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10530</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10530"/>
		<updated>2016-10-15T16:33:07Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} = H_1  \otimes ... \otimes H_1&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;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10523</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10523"/>
		<updated>2016-10-15T16:30:36Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того матрицу Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; можно получить по следующей формуле &amp;lt;math&amp;gt;H^{\otimes m} &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;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10517</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10517"/>
		<updated>2016-10-15T16:28:40Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&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;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10516</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10516"/>
		<updated>2016-10-15T16:28:26Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_m&lt;br /&gt;
\\H_m &amp;amp; -H_m&lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&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;/div&gt;</summary>
		<author><name>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10503</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10503"/>
		<updated>2016-10-15T16:25:47Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_&lt;br /&gt;
\\H_ &amp;amp; -H_m &lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&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;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10502</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10502"/>
		<updated>2016-10-15T16:25:21Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_,&lt;br /&gt;
\\H_, &amp;amp; -H_m &lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
является матрицей Адамара порядка &amp;lt;math&amp;gt;2^{m+1}&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;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10494</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10494"/>
		<updated>2016-10-15T16:23:32Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_,&lt;br /&gt;
\\H_, &amp;amp; -H_m &lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10492</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10492"/>
		<updated>2016-10-15T16:23:14Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вообще, если &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt; матрица Адамара порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;, то матрица &lt;br /&gt;
&amp;lt;math&amp;gt;H_{m+1} = &lt;br /&gt;
\begin{pmatrix} H_m &amp;amp; H_,&lt;br /&gt;
\\H_, &amp;amp; -H_m &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10482</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10482"/>
		<updated>2016-10-15T16:20:48Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10479</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10479"/>
		<updated>2016-10-15T16:20:26Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_2 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1 &amp;amp; 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; 1 &amp;amp;- 1 &amp;amp; -1&lt;br /&gt;
\\1 &amp;amp; -1 &amp;amp; -1 &amp;amp; 1&lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10475</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10475"/>
		<updated>2016-10-15T16:19:28Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10472</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10472"/>
		<updated>2016-10-15T16:19:12Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&amp;lt;math&amp;gt;H_0 = (1);&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;H_1 = &lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\1 &amp;amp; -1 &lt;br /&gt;
\end{pmatrix};&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10470</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10470"/>
		<updated>2016-10-15T16:18:19Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&amp;lt;math&amp;gt;H_0= (1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;H_1= ((1,1),(1,-1))&lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\a_{21} &amp;amp; a_{22} &lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp;&lt;br /&gt;
\\ a_{m1} &amp;amp; a_{m2} &amp;amp;&lt;br /&gt;
\end{pmatrix} ;&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10468</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10468"/>
		<updated>2016-10-15T16:18:08Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&amp;lt;math&amp;gt;H_0= (1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;H_1= ((1,1),(1,-1))&amp;lt;/math&amp;gt;&lt;br /&gt;
\begin{pmatrix} 1 &amp;amp; 1&lt;br /&gt;
\\a_{21} &amp;amp; a_{22} &lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp;&lt;br /&gt;
\\ a_{m1} &amp;amp; a_{m2} &amp;amp;&lt;br /&gt;
\end{pmatrix} ;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10454</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10454"/>
		<updated>2016-10-15T16:15:56Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&amp;lt;math&amp;gt;H_0= (1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;H_1= ((1,1),(1,-1))&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;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10451</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10451"/>
		<updated>2016-10-15T16:15:28Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерами матриц Адамара различных размеров являются следующие матрицы:&lt;br /&gt;
&amp;lt;math&amp;gt;H_0= (1)&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;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10445</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10445"/>
		<updated>2016-10-15T16:12:31Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&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;H_m&amp;lt;/math&amp;gt; подразумевается матрица порядка &amp;lt;math&amp;gt;2^m&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;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10433</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10433"/>
		<updated>2016-10-15T16:08:10Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&lt;br /&gt;
* перестановка строчек или столбцов местами.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара, получаемые друг из друга многократным применением указанных выше преобразований называются эквивалентными.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара называется нормализованной, если её первая строка и столбец состоят только из единиц.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10432</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10432"/>
		<updated>2016-10-15T16:07:36Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&lt;br /&gt;
* перестановка строчек или столбцов местами.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара, получаемые друг из друга многократным применением указанных выше преобразований называются эквивалентными.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара называется нормализованной, если её первая строка и столбец состоят только из единиц.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара находят широкое применение в теории кодирования (коды, исправляющие ошибки), теории планирования многофакторных экспериментов (ортогональные блок-схемы), квантовой информатике и прочих областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10423</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10423"/>
		<updated>2016-10-15T16:05:29Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&lt;br /&gt;
* перестановка строчек или столбцов местами.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара, получаемые друг из друга многократным применением указанных выше преобразований называются эквивалентными.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара называется нормализованной, если её первая строка и столбец состоят только из единиц.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10420</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10420"/>
		<updated>2016-10-15T16:04:45Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
* умножение строчки или столбца на −1;&lt;br /&gt;
* перестановка строчек или столбцов местами.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара, получаемые друг из друга многократным применением указанных выше преобразований называются эквивалентными.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара называется нормализованной, если у неё первая строчка и столбец состоят из одних единиц.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10416</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10416"/>
		<updated>2016-10-15T16:03:32Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
1) умножение строчки или столбца на −1;&lt;br /&gt;
2) перестановка строчек или столбцов местами.&lt;br /&gt;
&lt;br /&gt;
Матрицы Адамара, получаемые друг из друга многократным применением указанных выше преобразований называются эквивалентными.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара называется нормализованной, если у неё первая строчка и столбец состоят из одних единиц.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10414</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10414"/>
		<updated>2016-10-15T16:03:25Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
1) умножение строчки или столбца на −1;&lt;br /&gt;
2) перестановка строчек или столбцов местами.&lt;br /&gt;
Матрицы Адамара, получаемые друг из друга многократным применением указанных выше преобразований называются эквивалентными.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара называется нормализованной, если у неё первая строчка и столбец состоят из одних единиц.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10412</id>
		<title>Участник:Khotkin/Построение матрицы Адамара произвольного размера</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Khotkin/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%90%D0%B4%D0%B0%D0%BC%D0%B0%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0&amp;diff=10412"/>
		<updated>2016-10-15T16:03:16Z</updated>

		<summary type="html">&lt;p&gt;Khotkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Сюда тоже запилим&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:Teplov|А.М.Теплов]] (разделы [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Динамические характеристики и эффективность реализации алгоритма|2.5]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Матрица Адамара&#039;&#039;&#039; &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; представляет собой матрицу размера  &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039; из элементов  &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;, такую, что: &amp;lt;math&amp;gt;H \cdot H^T = n \cdot E_n,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;E_n&amp;lt;/math&amp;gt; — это единичная матрица размера &#039;&#039;n&#039;&#039;×&#039;&#039;n&#039;&#039;.&lt;br /&gt;
Матрица Адамара остаётся матрицей Адамара при следующих преобразованиях:&lt;br /&gt;
1) умножение строчки или столбца на −1;&lt;br /&gt;
2) перестановка строчек или столбцов местами.&lt;br /&gt;
Матрицы Адамара, получаемые друг из друга многократным применением указанных выше преобразований называются эквивалентными.&lt;br /&gt;
&lt;br /&gt;
Матрица Адамара называется нормализованной, если у неё первая строчка и столбец состоят из одних единиц.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Khotkin</name></author>
	</entry>
</feed>