Библиотека алгоритмов: различия между версиями
| [непроверенная версия] | [непроверенная версия] |
| (не показаны 24 промежуточные версии этого же участника) | |||
| Строка 1: | Строка 1: | ||
=='''УМНОЖЕНИЕ МАТРИЦЫ НА ВЕКТОР'''== | =='''УМНОЖЕНИЕ МАТРИЦЫ НА ВЕКТОР'''== | ||
[[Файл: | [[Файл:XYprojection1.jpg|мини|XY projection]] | ||
=====Ссылка на описание в энциклопедии AlgoWiki:===== | =====Ссылка на описание в энциклопедии AlgoWiki:===== | ||
[https://algowiki-project.org/ru/Умножение_плотной_неособенной_матрицы_на_вектор_(последовательный_вещественный_вариант) Умножение плотной неособенной матрицы на вектор]</br> | [https://algowiki-project.org/ru/Умножение_плотной_неособенной_матрицы_на_вектор_(последовательный_вещественный_вариант) Умножение плотной неособенной матрицы на вектор]</br> | ||
| Строка 14: | Строка 12: | ||
<algo></br> | <algo></br> | ||
: <params></br> | : <params></br> | ||
:: <param name=" | :: <param name="n" type="int" value="5"></param></br> | ||
:: <param name="m" type="int" value="4"></param></br> | |||
: </params></br></br> | : </params></br></br> | ||
: <block dims="2"></br> | : <block dims="2"></br> | ||
:: <arg name="i" val=" | :: <arg name="i" val="1..m"></arg></br> | ||
:: <arg name="j" val="1.. | :: <arg name="j" val="1..n+1"></arg></br> | ||
:: <vertex condition="" type="2"></br> | :: <vertex condition="j>1" type="2"></br> | ||
::: <in src="i,j-1"></in></br> | ::: <in src="i,j-1"></in></br> | ||
:: </vertex></br> | :: </vertex></br> | ||
: </block></br> | : </block></br> | ||
</algo></br> | </algo></br> | ||
На рисунках представлен результат для матрицы размером | =====Характеристики алгоритма (Для умножения матрицы размером m строк на n столбцов на вектор порядка n):===== | ||
* Общее количество вершин: m*n+m | |||
* Длина критического пути: n | |||
* Каноническая ширина ЯПФ: m | |||
На рисунках представлен результат для матрицы размером 4*5 и вектора длины 5</br> | |||
=='''ПЕРЕМНОЖЕНИЕ МАТРИЦ'''== | =='''ПЕРЕМНОЖЕНИЕ МАТРИЦ'''== | ||
[[Файл: | [[Файл:XYprojection2.jpg|мини|XY projection]] | ||
[[Файл: | [[Файл:YZprojection_2.jpg|мини|YZ projection]] | ||
[[Файл: | [[Файл:XZprojection2.jpg|мини|XZ projection]] | ||
=====Ссылка на описание в энциклопедии AlgoWiki:===== | =====Ссылка на описание в энциклопедии AlgoWiki:===== | ||
[https://algowiki-project.org/ru/Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант) Перемножение плотных неособенных матриц]</br> | [https://algowiki-project.org/ru/Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант) Перемножение плотных неособенных матриц]</br> | ||
| Строка 45: | Строка 48: | ||
<algo></br> | <algo></br> | ||
: <params></br> | : <params></br> | ||
:: <param name="m" type="int" value=" | :: <param name="m" type="int" value="4"></param></br> | ||
:: <param name="n" type="int" value=" | :: <param name="n" type="int" value="5"></param></br> | ||
:: <param name="l" type="int" value=" | :: <param name="l" type="int" value="6"></param></br> | ||
: </params></br></br> | : </params></br></br> | ||
| Строка 53: | Строка 56: | ||
:: <arg name="i" val="1..m"></arg></br> | :: <arg name="i" val="1..m"></arg></br> | ||
:: <arg name="j" val="1..l"></arg></br> | :: <arg name="j" val="1..l"></arg></br> | ||
:: <arg name="k" val="1..n"></arg></br> | :: <arg name="k" val="1..n+1"></arg></br> | ||
:: <vertex condition="k | :: <vertex condition="k>1" type="3"></br> | ||
::: <in src="i,j,k-1"></in></br> | ::: <in src="i,j,k-1"></in></br> | ||
:: </vertex></br> | :: </vertex></br> | ||
: </block></br> | : </block></br> | ||
</algo></br> | </algo></br> | ||
На рисунках представлено изображение графа алгоритма | =====Характеристики алгоритма (Для умножения матрицы размером m строк на n столбцов на матрицу размером n строк на l столбцов):===== | ||
* Общее количество вершин: m*n*l | |||
* Длина критического пути: n | |||
* Каноническая ширина ЯПФ: m*l | |||
На рисунках представлено изображение графа алгоритма выходных данных для случая перемножения двух квадратных матриц порядка 4*5 и 5*6</br></br></br></br></br></br></br></br></br></br></br></br> | |||
==''' | =='''НАХОЖДЕНИЕ СУММЫ ЭЛЕМЕНТОВ МАССИВА СДВАИВАНИЕМ'''== | ||
[[Файл: | [[Файл:XYprojection3.jpg|мини|XY projection]] | ||
=====Ссылка на описание в энциклопедии AlgoWiki:===== | =====Ссылка на описание в энциклопедии AlgoWiki:===== | ||
[https://algowiki-project.org/ru/ | [https://algowiki-project.org/ru/Нахождение_суммы_элементов_массива_сдваиванием Нахождение суммы элементов массива сдваиванием]</br> | ||
=====Реализация алгоритма на Си:===== | =====Реализация алгоритма на Си:===== | ||
for ( int i= | for(int i=1;i<=h;i++)</br> | ||
: for (int j=0; j< | : for(int j=0;j<arr_size;j++)</br> | ||
: | :: if(j<(arr_size/(pow(2,i))))</br> | ||
:: | ::: arr[j]=arr[j*2]+arr[2*j+1]; </br> | ||
:: | |||
::: | =====Описание алгоритма на Algolang:===== | ||
: | <algo></br> | ||
: <params></br> | |||
:: <param name="n" type="int" value="8"></param></br> | |||
: </params></br></br> | |||
: <block dims="2"></br> | |||
:: <arg name="i" val="1..((2)log(n)+1)"></arg></br> | |||
:: <arg name="j" val="1..n"></arg></br> | |||
:: <vertex condition="(i>1)and(j<=(n/(2^(i-1))))" type="1"></br> | |||
::: <in src="i-1,j*2-1"></in></br> | |||
::: <in src="i-1,j*2"></in></br> | |||
:: </vertex></br> | |||
: </block></br> | |||
</algo></br> | |||
=====Характеристики алгоритма (для суммирования массива порядка n):===== | |||
* Общее количество вершин: n-1 | |||
* Длина критического пути: [Log<sub>2</sub>n] | |||
* Каноническая ширина ЯПФ: n | |||
На рисунке изображён граф алгоритма. В данном случае выполнено суммирование 8 элементов массива. Вершины, соответствующие входным данным, обозначены октаэдром.</br> | |||
=='''ПОСЛЕДОВАТЕЛЬНО-ПАРАЛЛЕЛЬНЫЙ МЕТОД СУММИРОВАНИЯ'''== | |||
[[Файл:XYprojection5.jpg|мини|XY projection]] | |||
=====Ссылка на описание в энциклопедии AlgoWiki:===== | |||
[https://algowiki-project.org/ru/Последовательно-параллельный_метод_суммирования Последовательно-параллельный метод суммирования]</br> | |||
=====Описание алгоритма на Algolang:===== | |||
<algo></br> | |||
: <params></br> | |||
:: <param name="n" type="int" value="25"></param></br> | |||
:: <param name="p" type="int" value="5"></param></br> | |||
: </params></br></br> | |||
: <block id="0" dims="2"></br> | |||
:: количество процессоров | |||
:: <arg name="i" val="1..p"></arg></br> | |||
:: на каждый процессор, кроме одного, распределяется одинаковое количество | |||
:: элементов массива (n/p, округленное в бОльшую сторону) | |||
:: <arg name="j" val="1..n"></arg></br> | |||
:: <arg name="j" val="1..ceil(n/p)"></arg></br></br> | |||
:: сумма элементов массива, равномерно распределенных по (p-1) процессорам | |||
:: <vertex condition="(j>1)and(i>1)and(j<ceil(n/p))" type="1"></br> | |||
::: <in src="i,j-1"></in></br> | |||
:: </vertex></br></br> | |||
:: сумма оставшихся эелементов | |||
:: <vertex condition="(j>1)and(i=1)and(j<=(n-p-(ceil(n/p)-1)*(p-1)))" type="1"></br> | |||
::: <in src="i,j-1"></in></br> | |||
:: </vertex></br></br> | |||
:: последовательное суммирование получившихся сумм на одном из процессоров | |||
:: <vertex condition="(i>2)and(j=ceil(n/p))" type="1"></br> | |||
::: <in src="i-1,j"></in> | |||
::: <in src="i,j-1"></in> | |||
:: </vertex></br> | |||
:: <vertex condition="(i=2)and(j=ceil(n/p))" type="1"></br> | |||
::: <in src="i-1,n-p-(ceil(n/p)-1)*(p-1)"></in></in> | |||
::: <in src="i,j-1"></in> | |||
:: </vertex></br> | |||
: </block></br> | |||
</algo></br> | |||
=====Характеристики алгоритма (Для суммирования массива порядка n):===== | |||
* Общее количество вершин: n-1 | |||
* Длина критического пути: | |||
**ceil(n/p)-1 - суммирования по частям массива (p ветвей) | |||
**p-1 - одна последовательная ветвь | |||
* Каноническая ширина ЯПФ: p | |||
На рисунке изображён граф алгоритма без входных и выходных данных для случая суммирования 25 элементов массива на 5 процессорах.</br> | |||
=='''Компактная схема метода Гаусса для трёхдиагональной матрицы'''== | |||
[[Файл:XYprojection4.jpg|мини|XY projection]] | |||
=====Ссылка на описание в энциклопедии AlgoWiki:===== | |||
[https://algowiki-project.org/ru/Компактная_схема_метода_Гаусса_для_трёхдиагональной_матрицы,_последовательный_вариант Компактная схема метода Гаусса для трёхдиагональной матрицы]</br> | |||
=====Описание алгоритма на Algolang:===== | =====Описание алгоритма на Algolang:===== | ||
<algo></br> | <algo></br> | ||
: <params></br> | : <params></br> | ||
:: <param name="n" type="int" value="6"></param></br> | |||
:: <param name="n" type="int" value=" | |||
: </params></br></br> | : </params></br></br> | ||
: <block id=" | : <block id="0" dims="2"></br> | ||
:: <arg name=" | :: <arg name="j" val="1..n"></arg> | ||
:: <arg name=" | :: <arg name="i" val="1..n"></arg></br></br> | ||
:: < | |||
:: <vertex condition=" | :: деление | ||
::: <in src=" | :: <vertex condition="(i=j+1)and(j>1)" type="1"></br> | ||
::: <in src="j,j"></in></br> | |||
:: </vertex></br></br> | |||
:: вычетание | |||
:: <vertex condition="(j=i)and(j>1)" type="2"></br> | |||
::: <in src="j,i-1"></in></br> | |||
:: </vertex></br></br> | |||
:: умножение | |||
:: <vertex condition="j=i+1" type="3"></br> | |||
::: <in src="j-1,i+1"></in></br> | |||
:: </vertex></br> | :: </vertex></br> | ||
: </block></br> | : </block></br> | ||
</algo></br> | </algo></br> | ||
На | =====Характеристики алгоритма (Для матрицы с рангом n):===== | ||
* Общее количество вершин: 3n-3 | |||
* Длина критического пути: | |||
**n−1 ярусов делений | |||
**n−1 ярусов умножений | |||
**n−1 ярусов сложений (вычитаний) | |||
* Каноническая ширина ЯПФ: 1 | |||
На рисунке изображён граф алгоритма для n=6.</br> | |||
=='''Простой алгоритм Кули-Тьюки быстрого преобразования Фурье для степеней двойки'''== | |||
[[Файл:XYprojection6.jpg|мини|XY projection]] | |||
=====Ссылка на описание в энциклопедии AlgoWiki:===== | |||
[https://algowiki-project.org/ru/Простой_алгоритм_Кули-Тьюки_быстрого_преобразования_Фурье_для_степеней_двойки Простой алгоритм Кули-Тьюки быстрого преобразования Фурье для степеней двойки]</br> | |||
=====Описание алгоритма на Algolang:===== | |||
<algo></br> | |||
: <params></br> | |||
:: <param name = "N" type = "int" value = "3"></param></br> | |||
: </params></br></br> | |||
: <block id="0" dims="2"></br> | |||
:: <arg name = "I" val = "1..N"></arg></br> | |||
:: <arg name = "J" val = "1..2^N"></arg></br></br> | |||
:: <vertex condition = "(J - 1) % (2^I) < 2^(I - 1)" type = "1"></br> | |||
::: <in src = "I - 1, J"></in></br> | |||
::: <in src = "I - 1, J + 2^(I -1)"></in></br> | |||
:: </vertex></br></br> | |||
:: <vertex condition = "(J - 1) % (2^I) >= 2^(I - 1)" type = "2"></br> | |||
::: <in src = "I - 1, J"></in></br> | |||
::: <in src = "I - 1, J - 2^(I - 1)"></in></br> | |||
:: </vertex></br></br> | |||
: </block></br> | |||
</algo></br> | |||
=====Характеристики алгоритма (Для вектора с размерностью n):===== | |||
* Общее количество вершин: n*log<sub>2</sub>n | |||
* Длина критического пути: | |||
**log<sub>2</sub>n операций комплексного сложения/вычитания | |||
** log<sub>2</sub>n операций комплексного умножения | |||
* Каноническая ширина ЯПФ: n | |||
На рисунке изображён граф алгоритма для n=8.</br> | |||
=='''Метод Гивенса (вращений) QR-разложения квадратной матрицы'''== | |||
[[Файл:XYprojection7.jpg|мини|XY projection]] | |||
[[Файл:YZprojection7.jpg|мини|YZ projection]] | |||
[[Файл:XZprojection7.jpg|мини|XZ projection]] | |||
=====Ссылка на описание в энциклопедии AlgoWiki:===== | |||
[https://algowiki-project.org/ru/Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_точечный_вариант) Простой алгоритм Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный точечный вариант)]</br> | |||
=====Описание алгоритма на Algolang:===== | |||
<algo> | |||
: <params> | |||
:: <param name="n" type="int" value="5"></param> | |||
: </params> | |||
: <block dims="3"> | |||
:: <arg name="k" val="1..n-1"></arg> | |||
:: <arg name="i" val="1..n-1"></arg> | |||
:: <arg name="j" val="1..n"></arg> | |||
:: выполнение поворота 2-мерного вектора 1 яруса | |||
:: <vertex condition="(j>k)and(i=k)and(k=1)" type="2"> | |||
::: <in src="k,i,k"></in> | |||
:: </vertex> | |||
:: выполнение поворота 2-мерного вектора 1 яруса | |||
:: <vertex condition="(j>k)and(i>k)and(k=1)" type="2"> | |||
::: <in src="k,i,k"></in> | |||
::: <in src="k,i-1,j"></in> | |||
:: </vertex> | |||
:: выполнение поворота 2-мерного вектора остальных ярусов | |||
:: <vertex condition="(j>k)and(k>1)and(i=k)" type="2"> | |||
::: <in src="k,i,k"></in> | |||
::: <in src="k-1,i,j"></in> | |||
::: <in src="k-1,i-1,j"></in> | |||
:: </vertex> | |||
:: операция вычисления параметров поворота остальных ярусов | |||
:: <vertex condition="(j=k)and(k>1)and(i=k)" type="1"> | |||
::: <in src="k-1,i,j"></in> | |||
::: <in src="k-1,i-1,j"></in> | |||
:: </vertex> | |||
:: выполнение поворота 2-мерного вектора остальных ярусов | |||
:: <vertex condition="(j>k)and(k>1)and(i>k)" type="2"> | |||
::: <in src="k,i,k"></in> | |||
::: <in src="k-1,i,j"></in> | |||
::: <in src="k,i-1,j"></in> | |||
:: </vertex> | |||
:: операция вычисления параметров поворота остальных ярусов | |||
:: <vertex condition="(j=k)and(k>1)and(i>k)" type="1"> | |||
::: <in src="k-1,i,j"></in> | |||
:: </vertex> | |||
: </block> | |||
</algo> | |||
=====Характеристики алгоритма (Для матрицы порядка n):===== | |||
* Общее количество вершин: n<sup>3</sup>/3 | |||
* Длина критического пути: | |||
**2n−3 макровершины вычисления параметров поворота | |||
**n−1 макровершин поворотов | |||
* Каноническая ширина ЯПФ: n | |||
На рисунке изображён Граф алгоритма без отображения входных и выходных данных для n=5.</br> | |||
Текущая версия от 18:37, 17 мая 2021
УМНОЖЕНИЕ МАТРИЦЫ НА ВЕКТОР

Ссылка на описание в энциклопедии AlgoWiki:
Умножение плотной неособенной матрицы на вектор
Реализация алгоритма на Си:
for(int i = 0; i < size; i++)
- for(int j = 0; j < size ; j++)
- vec_out[i] += matrix[i][j] * vec _in[j];
- vec_out[i] += matrix[i][j] * vec _in[j];
Описание алгоритма на Algolang:
<algo>
- <params>
- <param name="n" type="int" value="5"></param>
- <param name="m" type="int" value="4"></param>
- <param name="n" type="int" value="5"></param>
- </params>
- <block dims="2">
- <arg name="i" val="1..m"></arg>
- <arg name="j" val="1..n+1"></arg>
- <vertex condition="j>1" type="2">
- <in src="i,j-1"></in>
- <in src="i,j-1"></in>
- </vertex>
- <arg name="i" val="1..m"></arg>
- </block>
</algo>
Характеристики алгоритма (Для умножения матрицы размером m строк на n столбцов на вектор порядка n):
- Общее количество вершин: m*n+m
- Длина критического пути: n
- Каноническая ширина ЯПФ: m
На рисунках представлен результат для матрицы размером 4*5 и вектора длины 5
ПЕРЕМНОЖЕНИЕ МАТРИЦ



Ссылка на описание в энциклопедии AlgoWiki:
Перемножение плотных неособенных матриц
Реализация алгоритма на Си:
for ( int i=0; i<size_1_str;i++)
- for (int j=0; j<size_2_col;j++)
- {
- matrix_out[i][j]=0;
- for(int k=0; k<size_common;k++)
- matrix_out[i][j]+=matrix_1[i][k]*matrix_2[k][j];
- matrix_out[i][j]+=matrix_1[i][k]*matrix_2[k][j];
- matrix_out[i][j]=0;
- }
Описание алгоритма на Algolang:
<algo>
- <params>
- <param name="m" type="int" value="4"></param>
- <param name="n" type="int" value="5"></param>
- <param name="l" type="int" value="6"></param>
- <param name="m" type="int" value="4"></param>
- </params>
- <block id="1" dims="3">
- <arg name="i" val="1..m"></arg>
- <arg name="j" val="1..l"></arg>
- <arg name="k" val="1..n+1"></arg>
- <vertex condition="k>1" type="3">
- <in src="i,j,k-1"></in>
- <in src="i,j,k-1"></in>
- </vertex>
- <arg name="i" val="1..m"></arg>
- </block>
</algo>
Характеристики алгоритма (Для умножения матрицы размером m строк на n столбцов на матрицу размером n строк на l столбцов):
- Общее количество вершин: m*n*l
- Длина критического пути: n
- Каноническая ширина ЯПФ: m*l
На рисунках представлено изображение графа алгоритма выходных данных для случая перемножения двух квадратных матриц порядка 4*5 и 5*6
НАХОЖДЕНИЕ СУММЫ ЭЛЕМЕНТОВ МАССИВА СДВАИВАНИЕМ

Ссылка на описание в энциклопедии AlgoWiki:
Нахождение суммы элементов массива сдваиванием
Реализация алгоритма на Си:
for(int i=1;i<=h;i++)
- for(int j=0;j<arr_size;j++)
- if(j<(arr_size/(pow(2,i))))
- arr[j]=arr[j*2]+arr[2*j+1];
- arr[j]=arr[j*2]+arr[2*j+1];
- if(j<(arr_size/(pow(2,i))))
Описание алгоритма на Algolang:
<algo>
- <params>
- <param name="n" type="int" value="8"></param>
- <param name="n" type="int" value="8"></param>
- </params>
- <block dims="2">
- <arg name="i" val="1..((2)log(n)+1)"></arg>
- <arg name="j" val="1..n"></arg>
- <vertex condition="(i>1)and(j<=(n/(2^(i-1))))" type="1">
- <in src="i-1,j*2-1"></in>
- <in src="i-1,j*2"></in>
- <in src="i-1,j*2-1"></in>
- </vertex>
- <arg name="i" val="1..((2)log(n)+1)"></arg>
- </block>
</algo>
Характеристики алгоритма (для суммирования массива порядка n):
- Общее количество вершин: n-1
- Длина критического пути: [Log2n]
- Каноническая ширина ЯПФ: n
На рисунке изображён граф алгоритма. В данном случае выполнено суммирование 8 элементов массива. Вершины, соответствующие входным данным, обозначены октаэдром.
ПОСЛЕДОВАТЕЛЬНО-ПАРАЛЛЕЛЬНЫЙ МЕТОД СУММИРОВАНИЯ

Ссылка на описание в энциклопедии AlgoWiki:
Последовательно-параллельный метод суммирования
Описание алгоритма на Algolang:
<algo>
- <params>
- <param name="n" type="int" value="25"></param>
- <param name="p" type="int" value="5"></param>
- <param name="n" type="int" value="25"></param>
- </params>
- <block id="0" dims="2">
- количество процессоров
- <arg name="i" val="1..p"></arg>
- на каждый процессор, кроме одного, распределяется одинаковое количество
- элементов массива (n/p, округленное в бОльшую сторону)
- <arg name="j" val="1..n"></arg>
- <arg name="j" val="1..ceil(n/p)"></arg>
- сумма элементов массива, равномерно распределенных по (p-1) процессорам
- <vertex condition="(j>1)and(i>1)and(j<ceil(n/p))" type="1">
- <in src="i,j-1"></in>
- <in src="i,j-1"></in>
- </vertex>
- сумма оставшихся эелементов
- <vertex condition="(j>1)and(i=1)and(j<=(n-p-(ceil(n/p)-1)*(p-1)))" type="1">
- <in src="i,j-1"></in>
- <in src="i,j-1"></in>
- </vertex>
- последовательное суммирование получившихся сумм на одном из процессоров
- <vertex condition="(i>2)and(j=ceil(n/p))" type="1">
- <in src="i-1,j"></in>
- <in src="i,j-1"></in>
- </vertex>
- <vertex condition="(i=2)and(j=ceil(n/p))" type="1">
- <in src="i-1,n-p-(ceil(n/p)-1)*(p-1)"></in></in>
- <in src="i,j-1"></in>
- </vertex>
- </block>
</algo>
Характеристики алгоритма (Для суммирования массива порядка n):
- Общее количество вершин: n-1
- Длина критического пути:
- ceil(n/p)-1 - суммирования по частям массива (p ветвей)
- p-1 - одна последовательная ветвь
- Каноническая ширина ЯПФ: p
На рисунке изображён граф алгоритма без входных и выходных данных для случая суммирования 25 элементов массива на 5 процессорах.
Компактная схема метода Гаусса для трёхдиагональной матрицы

Ссылка на описание в энциклопедии AlgoWiki:
Компактная схема метода Гаусса для трёхдиагональной матрицы
Описание алгоритма на Algolang:
<algo>
- <params>
- <param name="n" type="int" value="6"></param>
- <param name="n" type="int" value="6"></param>
- </params>
- <block id="0" dims="2">
- <arg name="j" val="1..n"></arg>
- <arg name="i" val="1..n"></arg>
- деление
- <vertex condition="(i=j+1)and(j>1)" type="1">
- <in src="j,j"></in>
- <in src="j,j"></in>
- </vertex>
- вычетание
- <vertex condition="(j=i)and(j>1)" type="2">
- <in src="j,i-1"></in>
- <in src="j,i-1"></in>
- </vertex>
- умножение
- <vertex condition="j=i+1" type="3">
- <in src="j-1,i+1"></in>
- <in src="j-1,i+1"></in>
- </vertex>
- </block>
</algo>
Характеристики алгоритма (Для матрицы с рангом n):
- Общее количество вершин: 3n-3
- Длина критического пути:
- n−1 ярусов делений
- n−1 ярусов умножений
- n−1 ярусов сложений (вычитаний)
- Каноническая ширина ЯПФ: 1
На рисунке изображён граф алгоритма для n=6.
Простой алгоритм Кули-Тьюки быстрого преобразования Фурье для степеней двойки

Ссылка на описание в энциклопедии AlgoWiki:
Простой алгоритм Кули-Тьюки быстрого преобразования Фурье для степеней двойки
Описание алгоритма на Algolang:
<algo>
- <params>
- <param name = "N" type = "int" value = "3"></param>
- <param name = "N" type = "int" value = "3"></param>
- </params>
- <block id="0" dims="2">
- <arg name = "I" val = "1..N"></arg>
- <arg name = "J" val = "1..2^N"></arg>
- <arg name = "I" val = "1..N"></arg>
- <vertex condition = "(J - 1) % (2^I) < 2^(I - 1)" type = "1">
- <in src = "I - 1, J"></in>
- <in src = "I - 1, J + 2^(I -1)"></in>
- <in src = "I - 1, J"></in>
- </vertex>
- <vertex condition = "(J - 1) % (2^I) < 2^(I - 1)" type = "1">
- <vertex condition = "(J - 1) % (2^I) >= 2^(I - 1)" type = "2">
- <in src = "I - 1, J"></in>
- <in src = "I - 1, J - 2^(I - 1)"></in>
- <in src = "I - 1, J"></in>
- </vertex>
- <vertex condition = "(J - 1) % (2^I) >= 2^(I - 1)" type = "2">
- </block>
</algo>
Характеристики алгоритма (Для вектора с размерностью n):
- Общее количество вершин: n*log2n
- Длина критического пути:
- log2n операций комплексного сложения/вычитания
- log2n операций комплексного умножения
- Каноническая ширина ЯПФ: n
На рисунке изображён граф алгоритма для n=8.
Метод Гивенса (вращений) QR-разложения квадратной матрицы



Ссылка на описание в энциклопедии AlgoWiki:
Описание алгоритма на Algolang:
<algo>
- <params>
- <param name="n" type="int" value="5"></param>
- </params>
- <block dims="3">
- <arg name="k" val="1..n-1"></arg>
- <arg name="i" val="1..n-1"></arg>
- <arg name="j" val="1..n"></arg>
- выполнение поворота 2-мерного вектора 1 яруса
- <vertex condition="(j>k)and(i=k)and(k=1)" type="2">
- <in src="k,i,k"></in>
- </vertex>
- выполнение поворота 2-мерного вектора 1 яруса
- <vertex condition="(j>k)and(i>k)and(k=1)" type="2">
- <in src="k,i,k"></in>
- <in src="k,i-1,j"></in>
- </vertex>
- выполнение поворота 2-мерного вектора остальных ярусов
- <vertex condition="(j>k)and(k>1)and(i=k)" type="2">
- <in src="k,i,k"></in>
- <in src="k-1,i,j"></in>
- <in src="k-1,i-1,j"></in>
- </vertex>
- операция вычисления параметров поворота остальных ярусов
- <vertex condition="(j=k)and(k>1)and(i=k)" type="1">
- <in src="k-1,i,j"></in>
- <in src="k-1,i-1,j"></in>
- </vertex>
- выполнение поворота 2-мерного вектора остальных ярусов
- <vertex condition="(j>k)and(k>1)and(i>k)" type="2">
- <in src="k,i,k"></in>
- <in src="k-1,i,j"></in>
- <in src="k,i-1,j"></in>
- </vertex>
- операция вычисления параметров поворота остальных ярусов
- <vertex condition="(j=k)and(k>1)and(i>k)" type="1">
- <in src="k-1,i,j"></in>
- </vertex>
- </block>
</algo>
Характеристики алгоритма (Для матрицы порядка n):
- Общее количество вершин: n3/3
- Длина критического пути:
- 2n−3 макровершины вычисления параметров поворота
- n−1 макровершин поворотов
- Каноническая ширина ЯПФ: n
На рисунке изображён Граф алгоритма без отображения входных и выходных данных для n=5.