<?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=Mikhail+Tsarev</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=Mikhail+Tsarev"/>
	<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/Mikhail_Tsarev"/>
	<updated>2026-10-23T01:17:38Z</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=12447</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=12447"/>
		<updated>2016-10-16T10:19:47Z</updated>

		<summary type="html">&lt;p&gt;Mikhail Tsarev: /* Свойства алгоритма */&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;, так как число операций меняется в зависимости от входных данных (числа 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;
=== Выводы для классов архитектур ===&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>Mikhail Tsarev</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=12058</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=12058"/>
		<updated>2016-10-15T20:58:38Z</updated>

		<summary type="html">&lt;p&gt;Mikhail Tsarev: /* Существующие реализации алгоритма */&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; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &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>Mikhail Tsarev</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=12051</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=12051"/>
		<updated>2016-10-15T20:57:44Z</updated>

		<summary type="html">&lt;p&gt;Mikhail Tsarev: /* Свойства алгоритма */&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; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &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;/div&gt;</summary>
		<author><name>Mikhail Tsarev</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=12045</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=12045"/>
		<updated>2016-10-15T20:57:14Z</updated>

		<summary type="html">&lt;p&gt;Mikhail Tsarev: /* Свойства алгоритма */&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; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\left( \approx 3m+3 \right).&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;/div&gt;</summary>
		<author><name>Mikhail Tsarev</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=12040</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=12040"/>
		<updated>2016-10-15T20:56:52Z</updated>

		<summary type="html">&lt;p&gt;Mikhail Tsarev: /* Свойства алгоритма */&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; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\left( \approx3m+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;/div&gt;</summary>
		<author><name>Mikhail Tsarev</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=12009</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=12009"/>
		<updated>2016-10-15T20:54:12Z</updated>

		<summary type="html">&lt;p&gt;Mikhail Tsarev: /* Свойства алгоритма */&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; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\left( \sim (3m+3),\,m\to+\infty \right).&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;/div&gt;</summary>
		<author><name>Mikhail Tsarev</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=12007</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=12007"/>
		<updated>2016-10-15T20:53:59Z</updated>

		<summary type="html">&lt;p&gt;Mikhail Tsarev: /* Свойства алгоритма */&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; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\left( \sim [3m+3],\,m\to+\infty \right).&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;/div&gt;</summary>
		<author><name>Mikhail Tsarev</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=12004</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=12004"/>
		<updated>2016-10-15T20:53:21Z</updated>

		<summary type="html">&lt;p&gt;Mikhail Tsarev: /* Свойства алгоритма */&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; алгоритма построения матрицы Адамара, как отношение числа операций к суммарному объему входных и выходных данных: &lt;br /&gt;
:&amp;lt;math&amp;gt;\,\frac{(3m+3)2^{2m}}{1+2^{2m}}\left( \sim [\frac{n}{4}],\,n\to+\infty \right).&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;/div&gt;</summary>
		<author><name>Mikhail Tsarev</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=11965</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=11965"/>
		<updated>2016-10-15T20:49:05Z</updated>

		<summary type="html">&lt;p&gt;Mikhail Tsarev: /* Свойства алгоритма */&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\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;/div&gt;</summary>
		<author><name>Mikhail Tsarev</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=11962</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=11962"/>
		<updated>2016-10-15T20:48:38Z</updated>

		<summary type="html">&lt;p&gt;Mikhail Tsarev: /* Свойства алгоритма */&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\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;/div&gt;</summary>
		<author><name>Mikhail Tsarev</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:Hadamar_graph.png&amp;diff=11611</id>
		<title>Файл:Hadamar graph.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Hadamar_graph.png&amp;diff=11611"/>
		<updated>2016-10-15T20:01:34Z</updated>

		<summary type="html">&lt;p&gt;Mikhail Tsarev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mikhail Tsarev</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=10394</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=10394"/>
		<updated>2016-10-15T15:59:10Z</updated>

		<summary type="html">&lt;p&gt;Mikhail Tsarev: &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;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;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>Mikhail Tsarev</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=10241</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=10241"/>
		<updated>2016-10-15T15:31:42Z</updated>

		<summary type="html">&lt;p&gt;Mikhail Tsarev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет! Здесь Кирилл Хоткин и Михаил Царев делают задание по суперкомпьютерам.&lt;br /&gt;
йойойо&lt;/div&gt;</summary>
		<author><name>Mikhail Tsarev</name></author>
	</entry>
</feed>