<?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=%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2+%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB</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=%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2+%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB"/>
	<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/%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB"/>
	<updated>2026-10-22T17:10:44Z</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:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28772</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28772"/>
		<updated>2021-12-12T20:43:53Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n],&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; четное, то &amp;lt;math&amp;gt;D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; нечетное, то &amp;lt;math&amp;gt;D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2n - 2&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;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
Информационный граф для количества процессов равного 4.&lt;br /&gt;
[[Файл:Diagram.png|Информационный граф]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;I-2uu^*&amp;lt;/math&amp;gt; - вычисление матрицы отражения;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;D, P, Q&amp;lt;/math&amp;gt; - умножение матрицы отражения на матрицы D, P, Q;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;TRANS&amp;lt;/math&amp;gt; - транспонирование матрицы D;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&amp;lt;br&amp;gt;Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и ее размер &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Выходные данные -- матрицы &amp;lt;math&amp;gt;P, Q, D,&amp;lt;/math&amp;gt; такие что &amp;lt;math&amp;gt;A = PDQ &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов является линейным.&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, линейна.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма == &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mpi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mkl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void matrixA_gen(double *A, int num, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	int r1 = 0, r2 = 0;&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
		{&lt;br /&gt;
			//A[i * m + j] = -1.0 * num * rand() / (double) RAND_MAX * i * j + 2.0 * rand() / (double) RAND_MAX;&lt;br /&gt;
			A[i*m + j] = i + 1 + num;&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void matrixP_gen(double *P, int num, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
	{&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
		{&lt;br /&gt;
			if((i % m) == j &amp;amp;&amp;amp; i &amp;gt;= num * m &amp;amp;&amp;amp; i &amp;lt; (num + 1) * m)&lt;br /&gt;
			{&lt;br /&gt;
				P[i * m + j] = 1;&lt;br /&gt;
			} else {&lt;br /&gt;
				P[i * m + j] = 0;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double sc_mult(double *a, double *b, int n)&lt;br /&gt;
{&lt;br /&gt;
    double sum = 0;&lt;br /&gt;
    for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        sum += a[i] * b[i];&lt;br /&gt;
    return sum;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
double norm(double *a, int n)&lt;br /&gt;
{&lt;br /&gt;
    return sqrt(sc_mult(a, a, n));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void mult_vec(double *A, double *u, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	char t = &#039;n&#039;;&lt;br /&gt;
	int int_one = 1;&lt;br /&gt;
	double *a, one = 1.0, zero = 0.0, min_two = -2.0;&lt;br /&gt;
	a = (double *)calloc(m, sizeof(*a));&lt;br /&gt;
	dgemv(&amp;amp;t, &amp;amp;m, &amp;amp;n, &amp;amp;one, A, &amp;amp;m, u, &amp;amp;int_one, &amp;amp;zero, a, &amp;amp;int_one); &lt;br /&gt;
	dger(&amp;amp;m, &amp;amp;n, &amp;amp;min_two, a, &amp;amp;int_one, u, &amp;amp;int_one, A, &amp;amp;m);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void mult(double *A, double *B, int l, int n)&lt;br /&gt;
{&lt;br /&gt;
    double *G;&lt;br /&gt;
    G = (double *)calloc(n * n, sizeof(*G));&lt;br /&gt;
    if(l)&lt;br /&gt;
    {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
            for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                for (int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
                    G[i * n + j] += A[i * n + k] * B[k * n + j];&lt;br /&gt;
    } else {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
            for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                for (int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
                    G[i * n + j] += B[i * n + k] * A[k * n + j];&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
            A[i*n + j] = G[i*n +j];&lt;br /&gt;
    free(G);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void reflect(double *u, double *a, int n, int j)&lt;br /&gt;
{&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    {&lt;br /&gt;
        if (i &amp;lt; j)&lt;br /&gt;
        {&lt;br /&gt;
            u[i] = 0;&lt;br /&gt;
        } else {&lt;br /&gt;
            if (i == j){&lt;br /&gt;
                u[i] = a[i] - norm(a, n);&lt;br /&gt;
            } else {&lt;br /&gt;
                u[i] = a[i];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    double sc = norm(u, n);&lt;br /&gt;
    if(sc != 0)&lt;br /&gt;
    {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        {&lt;br /&gt;
            u[i] /= sc;&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void trans(double *A, int n)&lt;br /&gt;
{&lt;br /&gt;
	double *B;&lt;br /&gt;
	B = (double *) calloc(n * n, sizeof(*B));&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
			B[i * n + j] = A[j * n + i];&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
                for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                        A[i * n + j] = B[i * n + j];&lt;br /&gt;
	free(B);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
    MPI_Init(&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;
    int size, num, error, n, m, i = 0;&lt;br /&gt;
    double d_norm = 0;&lt;br /&gt;
    MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;size);&lt;br /&gt;
    MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;num);&lt;br /&gt;
    n = 64;&lt;br /&gt;
    srand(time(NULL));&lt;br /&gt;
    if(size != 0)&lt;br /&gt;
    {&lt;br /&gt;
    	m = n/size;&lt;br /&gt;
    }&lt;br /&gt;
    MPI_Request req;&lt;br /&gt;
    MPI_Status status;&lt;br /&gt;
    double *M, *A, *P, *Q, *C, *D, *Df, *Pf, *Qf, *V, *A1, *W;&lt;br /&gt;
    double *u, *a;&lt;br /&gt;
    A1 = (double *) calloc(m * n, sizeof(*A1));&lt;br /&gt;
    V = (double *)calloc(n * n, sizeof(*V));&lt;br /&gt;
    W = (double *)calloc(n * n, sizeof(*W));&lt;br /&gt;
    Qf = (double *)calloc(n * n, sizeof(*Qf));&lt;br /&gt;
    M = (double *)calloc(n * n, sizeof(*M));&lt;br /&gt;
    Pf = (double *)calloc(n * n, sizeof(*Pf));&lt;br /&gt;
    A = (double *)calloc(n * m, sizeof(*A));&lt;br /&gt;
    P = (double *)calloc(n * m, sizeof(*P));&lt;br /&gt;
    Q  = (double *)calloc(n * m, sizeof(*Q));&lt;br /&gt;
    C = (double *)calloc(m * m, sizeof(*C));&lt;br /&gt;
    D = (double *)calloc(n * n, sizeof(*D));&lt;br /&gt;
    Df = (double *)calloc(n * n, sizeof(*Df));&lt;br /&gt;
    u = (double *)calloc(n, sizeof(*u));&lt;br /&gt;
    a = (double *)calloc(n, sizeof(*a));&lt;br /&gt;
    matrixA_gen(A, num, n, m);&lt;br /&gt;
    matrixP_gen(P, num, n, m);&lt;br /&gt;
    matrixP_gen(Q, num, n, m);&lt;br /&gt;
    MPI_Gather(A, n * m, MPI_DOUBLE, D, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    if(num == 0)&lt;br /&gt;
    {&lt;br /&gt;
    	for(int k = 0; k &amp;lt; size; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
			for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
			{&lt;br /&gt;
				M[h + k * m + j * n] = D[k * m * n + j * m + h];&lt;br /&gt;
			}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double t1 = MPI_Wtime();&lt;br /&gt;
    &lt;br /&gt;
    for(int f = 0; f &amp;lt; 2 * n - 2; f++)&lt;br /&gt;
    {&lt;br /&gt;
    	i = f / 2;&lt;br /&gt;
        if(i &amp;lt; num * m || i &amp;gt;= (num + 1) * m )&lt;br /&gt;
        {&lt;br /&gt;
            MPI_Recv(u, n, MPI_DOUBLE, (i / m), 0, MPI_COMM_WORLD, &amp;amp;status);&lt;br /&gt;
            mult_vec(A, u, n, m);&lt;br /&gt;
	    if(!(f%2))&lt;br /&gt;
	    	mult_vec(P, u, n, m);&lt;br /&gt;
	    else&lt;br /&gt;
	    	mult_vec(Q, u, n, m);&lt;br /&gt;
	 } else {&lt;br /&gt;
		if(!(f%2))&lt;br /&gt;
		{&lt;br /&gt;
			for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
			{&lt;br /&gt;
				if(k &amp;lt; i)&lt;br /&gt;
				{&lt;br /&gt;
					a[k] = 0;&lt;br /&gt;
				} else {&lt;br /&gt;
					a[k] = A[(i % m) + k * m];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			reflect(u, a, n, i);&lt;br /&gt;
			for(int l = 0; l &amp;lt; size; l++)&lt;br /&gt;
			{&lt;br /&gt;
				if(l != num)&lt;br /&gt;
				{&lt;br /&gt;
					MPI_Isend(u, n, MPI_DOUBLE, l, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
			{&lt;br /&gt;
				if(k &amp;lt; i+1)&lt;br /&gt;
				{&lt;br /&gt;
					a[k] = 0;&lt;br /&gt;
				} else {&lt;br /&gt;
					a[k] = A[(i % m) + k * m];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			reflect(u, a, n, i+1);&lt;br /&gt;
			for(int l = 0; l &amp;lt; size; l++)&lt;br /&gt;
			{&lt;br /&gt;
				if(l != num)&lt;br /&gt;
				{&lt;br /&gt;
					MPI_Isend(u, n, MPI_DOUBLE, l, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		mult_vec(A, u, n, m);&lt;br /&gt;
		if(!(f%2))&lt;br /&gt;
			mult_vec(P, u, n, m);&lt;br /&gt;
		else &lt;br /&gt;
			mult_vec(Q, u, n, m);&lt;br /&gt;
	}&lt;br /&gt;
	for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
			A1[k * m + j] = A[k * m + j];&lt;br /&gt;
	&lt;br /&gt;
	for(int j = 0; j &amp;lt; size; j++)&lt;br /&gt;
	{&lt;br /&gt;
		if(j != num)&lt;br /&gt;
		{&lt;br /&gt;
			for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                               	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                                	C[h * m + l] = A1[j * m * m + h + l * m];&lt;br /&gt;
                        MPI_Isend(C, m * m, MPI_DOUBLE, j, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
		} else {&lt;br /&gt;
			for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
        	        	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
	               	        	C[h * m + l] = A1[j * m * m + h + l * m];&lt;br /&gt;
					&lt;br /&gt;
                  	for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                        	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                        		A1[j * m * m + h + l * m] = C[h + l * m];&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for(int k = 0; k &amp;lt; size; k++)&lt;br /&gt;
	{&lt;br /&gt;
		if(k != num)&lt;br /&gt;
		{&lt;br /&gt;
			MPI_Recv(C, m * m, MPI_DOUBLE, k, 0, MPI_COMM_WORLD, &amp;amp;status);&lt;br /&gt;
		&lt;br /&gt;
                	for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                	{&lt;br /&gt;
				for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                	        {&lt;br /&gt;
                	        	A1[k * m * m + l + h * m] = C[h * m + l];&lt;br /&gt;
                	        }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
			A[k * m + j] = A1[k * m + j];&lt;br /&gt;
      }&lt;br /&gt;
    double t2 = MPI_Wtime();&lt;br /&gt;
    MPI_Gather(P, n * m, MPI_DOUBLE, D, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    MPI_Gather(Q, n * m, MPI_DOUBLE, W, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    MPI_Gather(A, n * m, MPI_DOUBLE, V, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Безымянный777.png|Результаты тестирования алгоритма на кластере ИВМ РАН]]&lt;br /&gt;
=== Особенности реализации последовательного алгоритма === &lt;br /&gt;
Для оптимальности работы алгоритма следует реализовать функцию умножения матрицы отражения матрицы отражения на произвольную матрицу, это заметно сократит время время его работы.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&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;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28771</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28771"/>
		<updated>2021-12-12T20:42:08Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n],&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; четное, то &amp;lt;math&amp;gt;D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; нечетное, то &amp;lt;math&amp;gt;D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2n - 2&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;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
[[Файл:Diagram.png|Информационный граф]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;I-2uu^*&amp;lt;/math&amp;gt; - вычисление матрицы отражения;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;D, P, Q&amp;lt;/math&amp;gt; - умножение матрицы отражения на матрицы D, P, Q;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;TRANS&amp;lt;/math&amp;gt; - транспонирование матрицы D;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&amp;lt;br&amp;gt;Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и ее размер &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Выходные данные -- матрицы &amp;lt;math&amp;gt;P, Q, D,&amp;lt;/math&amp;gt; такие что &amp;lt;math&amp;gt;A = PDQ &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов является линейным.&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, линейна.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма == &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mpi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mkl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void matrixA_gen(double *A, int num, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	int r1 = 0, r2 = 0;&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
		{&lt;br /&gt;
			//A[i * m + j] = -1.0 * num * rand() / (double) RAND_MAX * i * j + 2.0 * rand() / (double) RAND_MAX;&lt;br /&gt;
			A[i*m + j] = i + 1 + num;&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void matrixP_gen(double *P, int num, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
	{&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
		{&lt;br /&gt;
			if((i % m) == j &amp;amp;&amp;amp; i &amp;gt;= num * m &amp;amp;&amp;amp; i &amp;lt; (num + 1) * m)&lt;br /&gt;
			{&lt;br /&gt;
				P[i * m + j] = 1;&lt;br /&gt;
			} else {&lt;br /&gt;
				P[i * m + j] = 0;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double sc_mult(double *a, double *b, int n)&lt;br /&gt;
{&lt;br /&gt;
    double sum = 0;&lt;br /&gt;
    for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        sum += a[i] * b[i];&lt;br /&gt;
    return sum;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
double norm(double *a, int n)&lt;br /&gt;
{&lt;br /&gt;
    return sqrt(sc_mult(a, a, n));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void mult_vec(double *A, double *u, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	char t = &#039;n&#039;;&lt;br /&gt;
	int int_one = 1;&lt;br /&gt;
	double *a, one = 1.0, zero = 0.0, min_two = -2.0;&lt;br /&gt;
	a = (double *)calloc(m, sizeof(*a));&lt;br /&gt;
	dgemv(&amp;amp;t, &amp;amp;m, &amp;amp;n, &amp;amp;one, A, &amp;amp;m, u, &amp;amp;int_one, &amp;amp;zero, a, &amp;amp;int_one); &lt;br /&gt;
	dger(&amp;amp;m, &amp;amp;n, &amp;amp;min_two, a, &amp;amp;int_one, u, &amp;amp;int_one, A, &amp;amp;m);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void mult(double *A, double *B, int l, int n)&lt;br /&gt;
{&lt;br /&gt;
    double *G;&lt;br /&gt;
    G = (double *)calloc(n * n, sizeof(*G));&lt;br /&gt;
    if(l)&lt;br /&gt;
    {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
            for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                for (int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
                    G[i * n + j] += A[i * n + k] * B[k * n + j];&lt;br /&gt;
    } else {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
            for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                for (int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
                    G[i * n + j] += B[i * n + k] * A[k * n + j];&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
            A[i*n + j] = G[i*n +j];&lt;br /&gt;
    free(G);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void reflect(double *u, double *a, int n, int j)&lt;br /&gt;
{&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    {&lt;br /&gt;
        if (i &amp;lt; j)&lt;br /&gt;
        {&lt;br /&gt;
            u[i] = 0;&lt;br /&gt;
        } else {&lt;br /&gt;
            if (i == j){&lt;br /&gt;
                u[i] = a[i] - norm(a, n);&lt;br /&gt;
            } else {&lt;br /&gt;
                u[i] = a[i];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    double sc = norm(u, n);&lt;br /&gt;
    if(sc != 0)&lt;br /&gt;
    {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        {&lt;br /&gt;
            u[i] /= sc;&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void trans(double *A, int n)&lt;br /&gt;
{&lt;br /&gt;
	double *B;&lt;br /&gt;
	B = (double *) calloc(n * n, sizeof(*B));&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
			B[i * n + j] = A[j * n + i];&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
                for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                        A[i * n + j] = B[i * n + j];&lt;br /&gt;
	free(B);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
    MPI_Init(&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;
    int size, num, error, n, m, i = 0;&lt;br /&gt;
    double d_norm = 0;&lt;br /&gt;
    MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;size);&lt;br /&gt;
    MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;num);&lt;br /&gt;
    n = 64;&lt;br /&gt;
    srand(time(NULL));&lt;br /&gt;
    if(size != 0)&lt;br /&gt;
    {&lt;br /&gt;
    	m = n/size;&lt;br /&gt;
    }&lt;br /&gt;
    MPI_Request req;&lt;br /&gt;
    MPI_Status status;&lt;br /&gt;
    double *M, *A, *P, *Q, *C, *D, *Df, *Pf, *Qf, *V, *A1, *W;&lt;br /&gt;
    double *u, *a;&lt;br /&gt;
    A1 = (double *) calloc(m * n, sizeof(*A1));&lt;br /&gt;
    V = (double *)calloc(n * n, sizeof(*V));&lt;br /&gt;
    W = (double *)calloc(n * n, sizeof(*W));&lt;br /&gt;
    Qf = (double *)calloc(n * n, sizeof(*Qf));&lt;br /&gt;
    M = (double *)calloc(n * n, sizeof(*M));&lt;br /&gt;
    Pf = (double *)calloc(n * n, sizeof(*Pf));&lt;br /&gt;
    A = (double *)calloc(n * m, sizeof(*A));&lt;br /&gt;
    P = (double *)calloc(n * m, sizeof(*P));&lt;br /&gt;
    Q  = (double *)calloc(n * m, sizeof(*Q));&lt;br /&gt;
    C = (double *)calloc(m * m, sizeof(*C));&lt;br /&gt;
    D = (double *)calloc(n * n, sizeof(*D));&lt;br /&gt;
    Df = (double *)calloc(n * n, sizeof(*Df));&lt;br /&gt;
    u = (double *)calloc(n, sizeof(*u));&lt;br /&gt;
    a = (double *)calloc(n, sizeof(*a));&lt;br /&gt;
    matrixA_gen(A, num, n, m);&lt;br /&gt;
    matrixP_gen(P, num, n, m);&lt;br /&gt;
    matrixP_gen(Q, num, n, m);&lt;br /&gt;
    MPI_Gather(A, n * m, MPI_DOUBLE, D, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    if(num == 0)&lt;br /&gt;
    {&lt;br /&gt;
    	for(int k = 0; k &amp;lt; size; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
			for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
			{&lt;br /&gt;
				M[h + k * m + j * n] = D[k * m * n + j * m + h];&lt;br /&gt;
			}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double t1 = MPI_Wtime();&lt;br /&gt;
    &lt;br /&gt;
    for(int f = 0; f &amp;lt; 2 * n - 2; f++)&lt;br /&gt;
    {&lt;br /&gt;
    	i = f / 2;&lt;br /&gt;
        if(i &amp;lt; num * m || i &amp;gt;= (num + 1) * m )&lt;br /&gt;
        {&lt;br /&gt;
            MPI_Recv(u, n, MPI_DOUBLE, (i / m), 0, MPI_COMM_WORLD, &amp;amp;status);&lt;br /&gt;
            mult_vec(A, u, n, m);&lt;br /&gt;
	    if(!(f%2))&lt;br /&gt;
	    	mult_vec(P, u, n, m);&lt;br /&gt;
	    else&lt;br /&gt;
	    	mult_vec(Q, u, n, m);&lt;br /&gt;
	 } else {&lt;br /&gt;
		if(!(f%2))&lt;br /&gt;
		{&lt;br /&gt;
			for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
			{&lt;br /&gt;
				if(k &amp;lt; i)&lt;br /&gt;
				{&lt;br /&gt;
					a[k] = 0;&lt;br /&gt;
				} else {&lt;br /&gt;
					a[k] = A[(i % m) + k * m];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			reflect(u, a, n, i);&lt;br /&gt;
			for(int l = 0; l &amp;lt; size; l++)&lt;br /&gt;
			{&lt;br /&gt;
				if(l != num)&lt;br /&gt;
				{&lt;br /&gt;
					MPI_Isend(u, n, MPI_DOUBLE, l, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
			{&lt;br /&gt;
				if(k &amp;lt; i+1)&lt;br /&gt;
				{&lt;br /&gt;
					a[k] = 0;&lt;br /&gt;
				} else {&lt;br /&gt;
					a[k] = A[(i % m) + k * m];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			reflect(u, a, n, i+1);&lt;br /&gt;
			for(int l = 0; l &amp;lt; size; l++)&lt;br /&gt;
			{&lt;br /&gt;
				if(l != num)&lt;br /&gt;
				{&lt;br /&gt;
					MPI_Isend(u, n, MPI_DOUBLE, l, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		mult_vec(A, u, n, m);&lt;br /&gt;
		if(!(f%2))&lt;br /&gt;
			mult_vec(P, u, n, m);&lt;br /&gt;
		else &lt;br /&gt;
			mult_vec(Q, u, n, m);&lt;br /&gt;
	}&lt;br /&gt;
	for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
			A1[k * m + j] = A[k * m + j];&lt;br /&gt;
	&lt;br /&gt;
	for(int j = 0; j &amp;lt; size; j++)&lt;br /&gt;
	{&lt;br /&gt;
		if(j != num)&lt;br /&gt;
		{&lt;br /&gt;
			for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                               	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                                	C[h * m + l] = A1[j * m * m + h + l * m];&lt;br /&gt;
                        MPI_Isend(C, m * m, MPI_DOUBLE, j, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
		} else {&lt;br /&gt;
			for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
        	        	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
	               	        	C[h * m + l] = A1[j * m * m + h + l * m];&lt;br /&gt;
					&lt;br /&gt;
                  	for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                        	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                        		A1[j * m * m + h + l * m] = C[h + l * m];&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for(int k = 0; k &amp;lt; size; k++)&lt;br /&gt;
	{&lt;br /&gt;
		if(k != num)&lt;br /&gt;
		{&lt;br /&gt;
			MPI_Recv(C, m * m, MPI_DOUBLE, k, 0, MPI_COMM_WORLD, &amp;amp;status);&lt;br /&gt;
		&lt;br /&gt;
                	for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                	{&lt;br /&gt;
				for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                	        {&lt;br /&gt;
                	        	A1[k * m * m + l + h * m] = C[h * m + l];&lt;br /&gt;
                	        }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
			A[k * m + j] = A1[k * m + j];&lt;br /&gt;
      }&lt;br /&gt;
    double t2 = MPI_Wtime();&lt;br /&gt;
    MPI_Gather(P, n * m, MPI_DOUBLE, D, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    MPI_Gather(Q, n * m, MPI_DOUBLE, W, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    MPI_Gather(A, n * m, MPI_DOUBLE, V, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Безымянный777.png|Результаты тестирования алгоритма на кластере ИВМ РАН]]&lt;br /&gt;
=== Особенности реализации последовательного алгоритма === &lt;br /&gt;
Для оптимальности работы алгоритма следует реализовать функцию умножения матрицы отражения матрицы отражения на произвольную матрицу, это заметно сократит время время его работы.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&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;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</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:%D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8F%D0%BD%D0%BD%D1%8B%D0%B9777.png&amp;diff=28770</id>
		<title>Файл:Безымянный777.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:%D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8F%D0%BD%D0%BD%D1%8B%D0%B9777.png&amp;diff=28770"/>
		<updated>2021-12-12T20:41:09Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Результаты тестирования алгоритма на кластере ИВМ РАН&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28769</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28769"/>
		<updated>2021-12-12T20:30:58Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n],&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; четное, то &amp;lt;math&amp;gt;D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; нечетное, то &amp;lt;math&amp;gt;D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2n - 2&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;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
[[Файл:Diagram.png|Информационный граф]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;I-2uu^*&amp;lt;/math&amp;gt; - вычисление матрицы отражения;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;D, P, Q&amp;lt;/math&amp;gt; - умножение матрицы отражения на матрицы D, P, Q;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;TRANS&amp;lt;/math&amp;gt; - транспонирование матрицы D;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&amp;lt;br&amp;gt;Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и ее размер &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Выходные данные -- матрицы &amp;lt;math&amp;gt;P, Q, D,&amp;lt;/math&amp;gt; такие что &amp;lt;math&amp;gt;A = PDQ &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов является линейным.&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, линейна.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма == &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mpi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mkl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void matrixA_gen(double *A, int num, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	int r1 = 0, r2 = 0;&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
		{&lt;br /&gt;
			//A[i * m + j] = -1.0 * num * rand() / (double) RAND_MAX * i * j + 2.0 * rand() / (double) RAND_MAX;&lt;br /&gt;
			A[i*m + j] = i + 1 + num;&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void matrixP_gen(double *P, int num, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
	{&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
		{&lt;br /&gt;
			if((i % m) == j &amp;amp;&amp;amp; i &amp;gt;= num * m &amp;amp;&amp;amp; i &amp;lt; (num + 1) * m)&lt;br /&gt;
			{&lt;br /&gt;
				P[i * m + j] = 1;&lt;br /&gt;
			} else {&lt;br /&gt;
				P[i * m + j] = 0;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double sc_mult(double *a, double *b, int n)&lt;br /&gt;
{&lt;br /&gt;
    double sum = 0;&lt;br /&gt;
    for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        sum += a[i] * b[i];&lt;br /&gt;
    return sum;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
double norm(double *a, int n)&lt;br /&gt;
{&lt;br /&gt;
    return sqrt(sc_mult(a, a, n));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void mult_vec(double *A, double *u, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	char t = &#039;n&#039;;&lt;br /&gt;
	int int_one = 1;&lt;br /&gt;
	double *a, one = 1.0, zero = 0.0, min_two = -2.0;&lt;br /&gt;
	a = (double *)calloc(m, sizeof(*a));&lt;br /&gt;
	dgemv(&amp;amp;t, &amp;amp;m, &amp;amp;n, &amp;amp;one, A, &amp;amp;m, u, &amp;amp;int_one, &amp;amp;zero, a, &amp;amp;int_one); &lt;br /&gt;
	dger(&amp;amp;m, &amp;amp;n, &amp;amp;min_two, a, &amp;amp;int_one, u, &amp;amp;int_one, A, &amp;amp;m);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void mult(double *A, double *B, int l, int n)&lt;br /&gt;
{&lt;br /&gt;
    double *G;&lt;br /&gt;
    G = (double *)calloc(n * n, sizeof(*G));&lt;br /&gt;
    if(l)&lt;br /&gt;
    {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
            for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                for (int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
                    G[i * n + j] += A[i * n + k] * B[k * n + j];&lt;br /&gt;
    } else {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
            for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                for (int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
                    G[i * n + j] += B[i * n + k] * A[k * n + j];&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
            A[i*n + j] = G[i*n +j];&lt;br /&gt;
    free(G);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void reflect(double *u, double *a, int n, int j)&lt;br /&gt;
{&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    {&lt;br /&gt;
        if (i &amp;lt; j)&lt;br /&gt;
        {&lt;br /&gt;
            u[i] = 0;&lt;br /&gt;
        } else {&lt;br /&gt;
            if (i == j){&lt;br /&gt;
                u[i] = a[i] - norm(a, n);&lt;br /&gt;
            } else {&lt;br /&gt;
                u[i] = a[i];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    double sc = norm(u, n);&lt;br /&gt;
    if(sc != 0)&lt;br /&gt;
    {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        {&lt;br /&gt;
            u[i] /= sc;&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void trans(double *A, int n)&lt;br /&gt;
{&lt;br /&gt;
	double *B;&lt;br /&gt;
	B = (double *) calloc(n * n, sizeof(*B));&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
			B[i * n + j] = A[j * n + i];&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
                for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                        A[i * n + j] = B[i * n + j];&lt;br /&gt;
	free(B);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
    MPI_Init(&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;
    int size, num, error, n, m, i = 0;&lt;br /&gt;
    double d_norm = 0;&lt;br /&gt;
    MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;size);&lt;br /&gt;
    MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;num);&lt;br /&gt;
    n = 64;&lt;br /&gt;
    srand(time(NULL));&lt;br /&gt;
    if(size != 0)&lt;br /&gt;
    {&lt;br /&gt;
    	m = n/size;&lt;br /&gt;
    }&lt;br /&gt;
    MPI_Request req;&lt;br /&gt;
    MPI_Status status;&lt;br /&gt;
    double *M, *A, *P, *Q, *C, *D, *Df, *Pf, *Qf, *V, *A1, *W;&lt;br /&gt;
    double *u, *a;&lt;br /&gt;
    A1 = (double *) calloc(m * n, sizeof(*A1));&lt;br /&gt;
    V = (double *)calloc(n * n, sizeof(*V));&lt;br /&gt;
    W = (double *)calloc(n * n, sizeof(*W));&lt;br /&gt;
    Qf = (double *)calloc(n * n, sizeof(*Qf));&lt;br /&gt;
    M = (double *)calloc(n * n, sizeof(*M));&lt;br /&gt;
    Pf = (double *)calloc(n * n, sizeof(*Pf));&lt;br /&gt;
    A = (double *)calloc(n * m, sizeof(*A));&lt;br /&gt;
    P = (double *)calloc(n * m, sizeof(*P));&lt;br /&gt;
    Q  = (double *)calloc(n * m, sizeof(*Q));&lt;br /&gt;
    C = (double *)calloc(m * m, sizeof(*C));&lt;br /&gt;
    D = (double *)calloc(n * n, sizeof(*D));&lt;br /&gt;
    Df = (double *)calloc(n * n, sizeof(*Df));&lt;br /&gt;
    u = (double *)calloc(n, sizeof(*u));&lt;br /&gt;
    a = (double *)calloc(n, sizeof(*a));&lt;br /&gt;
    matrixA_gen(A, num, n, m);&lt;br /&gt;
    matrixP_gen(P, num, n, m);&lt;br /&gt;
    matrixP_gen(Q, num, n, m);&lt;br /&gt;
    MPI_Gather(A, n * m, MPI_DOUBLE, D, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    if(num == 0)&lt;br /&gt;
    {&lt;br /&gt;
    	for(int k = 0; k &amp;lt; size; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
			for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
			{&lt;br /&gt;
				M[h + k * m + j * n] = D[k * m * n + j * m + h];&lt;br /&gt;
			}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double t1 = MPI_Wtime();&lt;br /&gt;
    &lt;br /&gt;
    for(int f = 0; f &amp;lt; 2 * n - 2; f++)&lt;br /&gt;
    {&lt;br /&gt;
    	i = f / 2;&lt;br /&gt;
        if(i &amp;lt; num * m || i &amp;gt;= (num + 1) * m )&lt;br /&gt;
        {&lt;br /&gt;
            MPI_Recv(u, n, MPI_DOUBLE, (i / m), 0, MPI_COMM_WORLD, &amp;amp;status);&lt;br /&gt;
            mult_vec(A, u, n, m);&lt;br /&gt;
	    if(!(f%2))&lt;br /&gt;
	    	mult_vec(P, u, n, m);&lt;br /&gt;
	    else&lt;br /&gt;
	    	mult_vec(Q, u, n, m);&lt;br /&gt;
	 } else {&lt;br /&gt;
		if(!(f%2))&lt;br /&gt;
		{&lt;br /&gt;
			for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
			{&lt;br /&gt;
				if(k &amp;lt; i)&lt;br /&gt;
				{&lt;br /&gt;
					a[k] = 0;&lt;br /&gt;
				} else {&lt;br /&gt;
					a[k] = A[(i % m) + k * m];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			reflect(u, a, n, i);&lt;br /&gt;
			for(int l = 0; l &amp;lt; size; l++)&lt;br /&gt;
			{&lt;br /&gt;
				if(l != num)&lt;br /&gt;
				{&lt;br /&gt;
					MPI_Isend(u, n, MPI_DOUBLE, l, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
			{&lt;br /&gt;
				if(k &amp;lt; i+1)&lt;br /&gt;
				{&lt;br /&gt;
					a[k] = 0;&lt;br /&gt;
				} else {&lt;br /&gt;
					a[k] = A[(i % m) + k * m];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			reflect(u, a, n, i+1);&lt;br /&gt;
			for(int l = 0; l &amp;lt; size; l++)&lt;br /&gt;
			{&lt;br /&gt;
				if(l != num)&lt;br /&gt;
				{&lt;br /&gt;
					MPI_Isend(u, n, MPI_DOUBLE, l, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		mult_vec(A, u, n, m);&lt;br /&gt;
		if(!(f%2))&lt;br /&gt;
			mult_vec(P, u, n, m);&lt;br /&gt;
		else &lt;br /&gt;
			mult_vec(Q, u, n, m);&lt;br /&gt;
	}&lt;br /&gt;
	for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
			A1[k * m + j] = A[k * m + j];&lt;br /&gt;
	&lt;br /&gt;
	for(int j = 0; j &amp;lt; size; j++)&lt;br /&gt;
	{&lt;br /&gt;
		if(j != num)&lt;br /&gt;
		{&lt;br /&gt;
			for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                               	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                                	C[h * m + l] = A1[j * m * m + h + l * m];&lt;br /&gt;
                        MPI_Isend(C, m * m, MPI_DOUBLE, j, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
		} else {&lt;br /&gt;
			for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
        	        	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
	               	        	C[h * m + l] = A1[j * m * m + h + l * m];&lt;br /&gt;
					&lt;br /&gt;
                  	for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                        	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                        		A1[j * m * m + h + l * m] = C[h + l * m];&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for(int k = 0; k &amp;lt; size; k++)&lt;br /&gt;
	{&lt;br /&gt;
		if(k != num)&lt;br /&gt;
		{&lt;br /&gt;
			MPI_Recv(C, m * m, MPI_DOUBLE, k, 0, MPI_COMM_WORLD, &amp;amp;status);&lt;br /&gt;
		&lt;br /&gt;
                	for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                	{&lt;br /&gt;
				for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                	        {&lt;br /&gt;
                	        	A1[k * m * m + l + h * m] = C[h * m + l];&lt;br /&gt;
                	        }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
			A[k * m + j] = A1[k * m + j];&lt;br /&gt;
      }&lt;br /&gt;
    double t2 = MPI_Wtime();&lt;br /&gt;
    MPI_Gather(P, n * m, MPI_DOUBLE, D, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    MPI_Gather(Q, n * m, MPI_DOUBLE, W, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    MPI_Gather(A, n * m, MPI_DOUBLE, V, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма === &lt;br /&gt;
Для оптимальности работы алгоритма следует реализовать функцию умножения матрицы отражения матрицы отражения на произвольную матрицу, это заметно сократит время время его работы.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&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;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28768</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28768"/>
		<updated>2021-12-12T20:30:34Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n],&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; четное, то &amp;lt;math&amp;gt;D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; нечетное, то &amp;lt;math&amp;gt;D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2n - 2&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;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
[[Файл:Diagram.png|Информационный граф]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;I-2uu*&amp;lt;/math&amp;gt; - вычисление матрицы отражения;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;D, P, Q&amp;lt;/math&amp;gt; - умножение матрицы отражения на матрицы D, P, Q;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;TRANS&amp;lt;/math&amp;gt; - транспонирование матрицы D;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&amp;lt;br&amp;gt;Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и ее размер &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Выходные данные -- матрицы &amp;lt;math&amp;gt;P, Q, D,&amp;lt;/math&amp;gt; такие что &amp;lt;math&amp;gt;A = PDQ &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов является линейным.&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, линейна.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма == &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mpi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mkl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void matrixA_gen(double *A, int num, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	int r1 = 0, r2 = 0;&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
		{&lt;br /&gt;
			//A[i * m + j] = -1.0 * num * rand() / (double) RAND_MAX * i * j + 2.0 * rand() / (double) RAND_MAX;&lt;br /&gt;
			A[i*m + j] = i + 1 + num;&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void matrixP_gen(double *P, int num, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
	{&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
		{&lt;br /&gt;
			if((i % m) == j &amp;amp;&amp;amp; i &amp;gt;= num * m &amp;amp;&amp;amp; i &amp;lt; (num + 1) * m)&lt;br /&gt;
			{&lt;br /&gt;
				P[i * m + j] = 1;&lt;br /&gt;
			} else {&lt;br /&gt;
				P[i * m + j] = 0;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double sc_mult(double *a, double *b, int n)&lt;br /&gt;
{&lt;br /&gt;
    double sum = 0;&lt;br /&gt;
    for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        sum += a[i] * b[i];&lt;br /&gt;
    return sum;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
double norm(double *a, int n)&lt;br /&gt;
{&lt;br /&gt;
    return sqrt(sc_mult(a, a, n));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void mult_vec(double *A, double *u, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	char t = &#039;n&#039;;&lt;br /&gt;
	int int_one = 1;&lt;br /&gt;
	double *a, one = 1.0, zero = 0.0, min_two = -2.0;&lt;br /&gt;
	a = (double *)calloc(m, sizeof(*a));&lt;br /&gt;
	dgemv(&amp;amp;t, &amp;amp;m, &amp;amp;n, &amp;amp;one, A, &amp;amp;m, u, &amp;amp;int_one, &amp;amp;zero, a, &amp;amp;int_one); &lt;br /&gt;
	dger(&amp;amp;m, &amp;amp;n, &amp;amp;min_two, a, &amp;amp;int_one, u, &amp;amp;int_one, A, &amp;amp;m);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void mult(double *A, double *B, int l, int n)&lt;br /&gt;
{&lt;br /&gt;
    double *G;&lt;br /&gt;
    G = (double *)calloc(n * n, sizeof(*G));&lt;br /&gt;
    if(l)&lt;br /&gt;
    {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
            for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                for (int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
                    G[i * n + j] += A[i * n + k] * B[k * n + j];&lt;br /&gt;
    } else {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
            for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                for (int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
                    G[i * n + j] += B[i * n + k] * A[k * n + j];&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
            A[i*n + j] = G[i*n +j];&lt;br /&gt;
    free(G);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void reflect(double *u, double *a, int n, int j)&lt;br /&gt;
{&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    {&lt;br /&gt;
        if (i &amp;lt; j)&lt;br /&gt;
        {&lt;br /&gt;
            u[i] = 0;&lt;br /&gt;
        } else {&lt;br /&gt;
            if (i == j){&lt;br /&gt;
                u[i] = a[i] - norm(a, n);&lt;br /&gt;
            } else {&lt;br /&gt;
                u[i] = a[i];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    double sc = norm(u, n);&lt;br /&gt;
    if(sc != 0)&lt;br /&gt;
    {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        {&lt;br /&gt;
            u[i] /= sc;&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void trans(double *A, int n)&lt;br /&gt;
{&lt;br /&gt;
	double *B;&lt;br /&gt;
	B = (double *) calloc(n * n, sizeof(*B));&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
			B[i * n + j] = A[j * n + i];&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
                for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                        A[i * n + j] = B[i * n + j];&lt;br /&gt;
	free(B);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
    MPI_Init(&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;
    int size, num, error, n, m, i = 0;&lt;br /&gt;
    double d_norm = 0;&lt;br /&gt;
    MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;size);&lt;br /&gt;
    MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;num);&lt;br /&gt;
    n = 64;&lt;br /&gt;
    srand(time(NULL));&lt;br /&gt;
    if(size != 0)&lt;br /&gt;
    {&lt;br /&gt;
    	m = n/size;&lt;br /&gt;
    }&lt;br /&gt;
    MPI_Request req;&lt;br /&gt;
    MPI_Status status;&lt;br /&gt;
    double *M, *A, *P, *Q, *C, *D, *Df, *Pf, *Qf, *V, *A1, *W;&lt;br /&gt;
    double *u, *a;&lt;br /&gt;
    A1 = (double *) calloc(m * n, sizeof(*A1));&lt;br /&gt;
    V = (double *)calloc(n * n, sizeof(*V));&lt;br /&gt;
    W = (double *)calloc(n * n, sizeof(*W));&lt;br /&gt;
    Qf = (double *)calloc(n * n, sizeof(*Qf));&lt;br /&gt;
    M = (double *)calloc(n * n, sizeof(*M));&lt;br /&gt;
    Pf = (double *)calloc(n * n, sizeof(*Pf));&lt;br /&gt;
    A = (double *)calloc(n * m, sizeof(*A));&lt;br /&gt;
    P = (double *)calloc(n * m, sizeof(*P));&lt;br /&gt;
    Q  = (double *)calloc(n * m, sizeof(*Q));&lt;br /&gt;
    C = (double *)calloc(m * m, sizeof(*C));&lt;br /&gt;
    D = (double *)calloc(n * n, sizeof(*D));&lt;br /&gt;
    Df = (double *)calloc(n * n, sizeof(*Df));&lt;br /&gt;
    u = (double *)calloc(n, sizeof(*u));&lt;br /&gt;
    a = (double *)calloc(n, sizeof(*a));&lt;br /&gt;
    matrixA_gen(A, num, n, m);&lt;br /&gt;
    matrixP_gen(P, num, n, m);&lt;br /&gt;
    matrixP_gen(Q, num, n, m);&lt;br /&gt;
    MPI_Gather(A, n * m, MPI_DOUBLE, D, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    if(num == 0)&lt;br /&gt;
    {&lt;br /&gt;
    	for(int k = 0; k &amp;lt; size; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
			for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
			{&lt;br /&gt;
				M[h + k * m + j * n] = D[k * m * n + j * m + h];&lt;br /&gt;
			}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double t1 = MPI_Wtime();&lt;br /&gt;
    &lt;br /&gt;
    for(int f = 0; f &amp;lt; 2 * n - 2; f++)&lt;br /&gt;
    {&lt;br /&gt;
    	i = f / 2;&lt;br /&gt;
        if(i &amp;lt; num * m || i &amp;gt;= (num + 1) * m )&lt;br /&gt;
        {&lt;br /&gt;
            MPI_Recv(u, n, MPI_DOUBLE, (i / m), 0, MPI_COMM_WORLD, &amp;amp;status);&lt;br /&gt;
            mult_vec(A, u, n, m);&lt;br /&gt;
	    if(!(f%2))&lt;br /&gt;
	    	mult_vec(P, u, n, m);&lt;br /&gt;
	    else&lt;br /&gt;
	    	mult_vec(Q, u, n, m);&lt;br /&gt;
	 } else {&lt;br /&gt;
		if(!(f%2))&lt;br /&gt;
		{&lt;br /&gt;
			for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
			{&lt;br /&gt;
				if(k &amp;lt; i)&lt;br /&gt;
				{&lt;br /&gt;
					a[k] = 0;&lt;br /&gt;
				} else {&lt;br /&gt;
					a[k] = A[(i % m) + k * m];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			reflect(u, a, n, i);&lt;br /&gt;
			for(int l = 0; l &amp;lt; size; l++)&lt;br /&gt;
			{&lt;br /&gt;
				if(l != num)&lt;br /&gt;
				{&lt;br /&gt;
					MPI_Isend(u, n, MPI_DOUBLE, l, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
			{&lt;br /&gt;
				if(k &amp;lt; i+1)&lt;br /&gt;
				{&lt;br /&gt;
					a[k] = 0;&lt;br /&gt;
				} else {&lt;br /&gt;
					a[k] = A[(i % m) + k * m];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			reflect(u, a, n, i+1);&lt;br /&gt;
			for(int l = 0; l &amp;lt; size; l++)&lt;br /&gt;
			{&lt;br /&gt;
				if(l != num)&lt;br /&gt;
				{&lt;br /&gt;
					MPI_Isend(u, n, MPI_DOUBLE, l, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		mult_vec(A, u, n, m);&lt;br /&gt;
		if(!(f%2))&lt;br /&gt;
			mult_vec(P, u, n, m);&lt;br /&gt;
		else &lt;br /&gt;
			mult_vec(Q, u, n, m);&lt;br /&gt;
	}&lt;br /&gt;
	for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
			A1[k * m + j] = A[k * m + j];&lt;br /&gt;
	&lt;br /&gt;
	for(int j = 0; j &amp;lt; size; j++)&lt;br /&gt;
	{&lt;br /&gt;
		if(j != num)&lt;br /&gt;
		{&lt;br /&gt;
			for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                               	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                                	C[h * m + l] = A1[j * m * m + h + l * m];&lt;br /&gt;
                        MPI_Isend(C, m * m, MPI_DOUBLE, j, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
		} else {&lt;br /&gt;
			for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
        	        	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
	               	        	C[h * m + l] = A1[j * m * m + h + l * m];&lt;br /&gt;
					&lt;br /&gt;
                  	for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                        	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                        		A1[j * m * m + h + l * m] = C[h + l * m];&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for(int k = 0; k &amp;lt; size; k++)&lt;br /&gt;
	{&lt;br /&gt;
		if(k != num)&lt;br /&gt;
		{&lt;br /&gt;
			MPI_Recv(C, m * m, MPI_DOUBLE, k, 0, MPI_COMM_WORLD, &amp;amp;status);&lt;br /&gt;
		&lt;br /&gt;
                	for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                	{&lt;br /&gt;
				for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                	        {&lt;br /&gt;
                	        	A1[k * m * m + l + h * m] = C[h * m + l];&lt;br /&gt;
                	        }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
			A[k * m + j] = A1[k * m + j];&lt;br /&gt;
      }&lt;br /&gt;
    double t2 = MPI_Wtime();&lt;br /&gt;
    MPI_Gather(P, n * m, MPI_DOUBLE, D, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    MPI_Gather(Q, n * m, MPI_DOUBLE, W, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    MPI_Gather(A, n * m, MPI_DOUBLE, V, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма === &lt;br /&gt;
Для оптимальности работы алгоритма следует реализовать функцию умножения матрицы отражения матрицы отражения на произвольную матрицу, это заметно сократит время время его работы.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&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;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28767</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28767"/>
		<updated>2021-12-12T20:28:53Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n],&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; четное, то &amp;lt;math&amp;gt;D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; нечетное, то &amp;lt;math&amp;gt;D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2n - 2&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;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
[[Файл:Diagram.png|Информационный граф]]&lt;br /&gt;
&amp;lt;math&amp;gt;I-2uu*&amp;lt;/math&amp;gt; - вычисление матрицы отражения;&lt;br /&gt;
&amp;lt;math&amp;gt;D, P, Q&amp;lt;/math&amp;gt; - умножение матрицы отражения на матрицы D, P, Q;&lt;br /&gt;
&amp;lt;math&amp;gt;TRANS&amp;lt;/math&amp;gt; - транспонирование матрицы D;&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&amp;lt;br&amp;gt;Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и ее размер &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Выходные данные -- матрицы &amp;lt;math&amp;gt;P, Q, D,&amp;lt;/math&amp;gt; такие что &amp;lt;math&amp;gt;A = PDQ &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов является линейным.&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, линейна.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма == &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mpi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mkl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void matrixA_gen(double *A, int num, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	int r1 = 0, r2 = 0;&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
		{&lt;br /&gt;
			//A[i * m + j] = -1.0 * num * rand() / (double) RAND_MAX * i * j + 2.0 * rand() / (double) RAND_MAX;&lt;br /&gt;
			A[i*m + j] = i + 1 + num;&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void matrixP_gen(double *P, int num, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
	{&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
		{&lt;br /&gt;
			if((i % m) == j &amp;amp;&amp;amp; i &amp;gt;= num * m &amp;amp;&amp;amp; i &amp;lt; (num + 1) * m)&lt;br /&gt;
			{&lt;br /&gt;
				P[i * m + j] = 1;&lt;br /&gt;
			} else {&lt;br /&gt;
				P[i * m + j] = 0;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double sc_mult(double *a, double *b, int n)&lt;br /&gt;
{&lt;br /&gt;
    double sum = 0;&lt;br /&gt;
    for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        sum += a[i] * b[i];&lt;br /&gt;
    return sum;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
double norm(double *a, int n)&lt;br /&gt;
{&lt;br /&gt;
    return sqrt(sc_mult(a, a, n));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void mult_vec(double *A, double *u, int n, int m)&lt;br /&gt;
{&lt;br /&gt;
	char t = &#039;n&#039;;&lt;br /&gt;
	int int_one = 1;&lt;br /&gt;
	double *a, one = 1.0, zero = 0.0, min_two = -2.0;&lt;br /&gt;
	a = (double *)calloc(m, sizeof(*a));&lt;br /&gt;
	dgemv(&amp;amp;t, &amp;amp;m, &amp;amp;n, &amp;amp;one, A, &amp;amp;m, u, &amp;amp;int_one, &amp;amp;zero, a, &amp;amp;int_one); &lt;br /&gt;
	dger(&amp;amp;m, &amp;amp;n, &amp;amp;min_two, a, &amp;amp;int_one, u, &amp;amp;int_one, A, &amp;amp;m);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void mult(double *A, double *B, int l, int n)&lt;br /&gt;
{&lt;br /&gt;
    double *G;&lt;br /&gt;
    G = (double *)calloc(n * n, sizeof(*G));&lt;br /&gt;
    if(l)&lt;br /&gt;
    {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
            for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                for (int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
                    G[i * n + j] += A[i * n + k] * B[k * n + j];&lt;br /&gt;
    } else {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
            for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                for (int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
                    G[i * n + j] += B[i * n + k] * A[k * n + j];&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
            A[i*n + j] = G[i*n +j];&lt;br /&gt;
    free(G);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void reflect(double *u, double *a, int n, int j)&lt;br /&gt;
{&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
    {&lt;br /&gt;
        if (i &amp;lt; j)&lt;br /&gt;
        {&lt;br /&gt;
            u[i] = 0;&lt;br /&gt;
        } else {&lt;br /&gt;
            if (i == j){&lt;br /&gt;
                u[i] = a[i] - norm(a, n);&lt;br /&gt;
            } else {&lt;br /&gt;
                u[i] = a[i];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    double sc = norm(u, n);&lt;br /&gt;
    if(sc != 0)&lt;br /&gt;
    {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        {&lt;br /&gt;
            u[i] /= sc;&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void trans(double *A, int n)&lt;br /&gt;
{&lt;br /&gt;
	double *B;&lt;br /&gt;
	B = (double *) calloc(n * n, sizeof(*B));&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
			B[i * n + j] = A[j * n + i];&lt;br /&gt;
	for(int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
                for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
                        A[i * n + j] = B[i * n + j];&lt;br /&gt;
	free(B);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
    MPI_Init(&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;
    int size, num, error, n, m, i = 0;&lt;br /&gt;
    double d_norm = 0;&lt;br /&gt;
    MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;size);&lt;br /&gt;
    MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;num);&lt;br /&gt;
    n = 64;&lt;br /&gt;
    srand(time(NULL));&lt;br /&gt;
    if(size != 0)&lt;br /&gt;
    {&lt;br /&gt;
    	m = n/size;&lt;br /&gt;
    }&lt;br /&gt;
    MPI_Request req;&lt;br /&gt;
    MPI_Status status;&lt;br /&gt;
    double *M, *A, *P, *Q, *C, *D, *Df, *Pf, *Qf, *V, *A1, *W;&lt;br /&gt;
    double *u, *a;&lt;br /&gt;
    A1 = (double *) calloc(m * n, sizeof(*A1));&lt;br /&gt;
    V = (double *)calloc(n * n, sizeof(*V));&lt;br /&gt;
    W = (double *)calloc(n * n, sizeof(*W));&lt;br /&gt;
    Qf = (double *)calloc(n * n, sizeof(*Qf));&lt;br /&gt;
    M = (double *)calloc(n * n, sizeof(*M));&lt;br /&gt;
    Pf = (double *)calloc(n * n, sizeof(*Pf));&lt;br /&gt;
    A = (double *)calloc(n * m, sizeof(*A));&lt;br /&gt;
    P = (double *)calloc(n * m, sizeof(*P));&lt;br /&gt;
    Q  = (double *)calloc(n * m, sizeof(*Q));&lt;br /&gt;
    C = (double *)calloc(m * m, sizeof(*C));&lt;br /&gt;
    D = (double *)calloc(n * n, sizeof(*D));&lt;br /&gt;
    Df = (double *)calloc(n * n, sizeof(*Df));&lt;br /&gt;
    u = (double *)calloc(n, sizeof(*u));&lt;br /&gt;
    a = (double *)calloc(n, sizeof(*a));&lt;br /&gt;
    matrixA_gen(A, num, n, m);&lt;br /&gt;
    matrixP_gen(P, num, n, m);&lt;br /&gt;
    matrixP_gen(Q, num, n, m);&lt;br /&gt;
    MPI_Gather(A, n * m, MPI_DOUBLE, D, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    if(num == 0)&lt;br /&gt;
    {&lt;br /&gt;
    	for(int k = 0; k &amp;lt; size; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; n; j++)&lt;br /&gt;
			for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
			{&lt;br /&gt;
				M[h + k * m + j * n] = D[k * m * n + j * m + h];&lt;br /&gt;
			}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double t1 = MPI_Wtime();&lt;br /&gt;
    &lt;br /&gt;
    for(int f = 0; f &amp;lt; 2 * n - 2; f++)&lt;br /&gt;
    {&lt;br /&gt;
    	i = f / 2;&lt;br /&gt;
        if(i &amp;lt; num * m || i &amp;gt;= (num + 1) * m )&lt;br /&gt;
        {&lt;br /&gt;
            MPI_Recv(u, n, MPI_DOUBLE, (i / m), 0, MPI_COMM_WORLD, &amp;amp;status);&lt;br /&gt;
            mult_vec(A, u, n, m);&lt;br /&gt;
	    if(!(f%2))&lt;br /&gt;
	    	mult_vec(P, u, n, m);&lt;br /&gt;
	    else&lt;br /&gt;
	    	mult_vec(Q, u, n, m);&lt;br /&gt;
	 } else {&lt;br /&gt;
		if(!(f%2))&lt;br /&gt;
		{&lt;br /&gt;
			for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
			{&lt;br /&gt;
				if(k &amp;lt; i)&lt;br /&gt;
				{&lt;br /&gt;
					a[k] = 0;&lt;br /&gt;
				} else {&lt;br /&gt;
					a[k] = A[(i % m) + k * m];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			reflect(u, a, n, i);&lt;br /&gt;
			for(int l = 0; l &amp;lt; size; l++)&lt;br /&gt;
			{&lt;br /&gt;
				if(l != num)&lt;br /&gt;
				{&lt;br /&gt;
					MPI_Isend(u, n, MPI_DOUBLE, l, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
			{&lt;br /&gt;
				if(k &amp;lt; i+1)&lt;br /&gt;
				{&lt;br /&gt;
					a[k] = 0;&lt;br /&gt;
				} else {&lt;br /&gt;
					a[k] = A[(i % m) + k * m];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			reflect(u, a, n, i+1);&lt;br /&gt;
			for(int l = 0; l &amp;lt; size; l++)&lt;br /&gt;
			{&lt;br /&gt;
				if(l != num)&lt;br /&gt;
				{&lt;br /&gt;
					MPI_Isend(u, n, MPI_DOUBLE, l, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		mult_vec(A, u, n, m);&lt;br /&gt;
		if(!(f%2))&lt;br /&gt;
			mult_vec(P, u, n, m);&lt;br /&gt;
		else &lt;br /&gt;
			mult_vec(Q, u, n, m);&lt;br /&gt;
	}&lt;br /&gt;
	for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
			A1[k * m + j] = A[k * m + j];&lt;br /&gt;
	&lt;br /&gt;
	for(int j = 0; j &amp;lt; size; j++)&lt;br /&gt;
	{&lt;br /&gt;
		if(j != num)&lt;br /&gt;
		{&lt;br /&gt;
			for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                               	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                                	C[h * m + l] = A1[j * m * m + h + l * m];&lt;br /&gt;
                        MPI_Isend(C, m * m, MPI_DOUBLE, j, 0, MPI_COMM_WORLD, &amp;amp;req);&lt;br /&gt;
		} else {&lt;br /&gt;
			for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
        	        	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
	               	        	C[h * m + l] = A1[j * m * m + h + l * m];&lt;br /&gt;
					&lt;br /&gt;
                  	for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                        	for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                        		A1[j * m * m + h + l * m] = C[h + l * m];&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for(int k = 0; k &amp;lt; size; k++)&lt;br /&gt;
	{&lt;br /&gt;
		if(k != num)&lt;br /&gt;
		{&lt;br /&gt;
			MPI_Recv(C, m * m, MPI_DOUBLE, k, 0, MPI_COMM_WORLD, &amp;amp;status);&lt;br /&gt;
		&lt;br /&gt;
                	for(int l = 0; l &amp;lt; m; l++)&lt;br /&gt;
                	{&lt;br /&gt;
				for(int h = 0; h &amp;lt; m; h++)&lt;br /&gt;
                	        {&lt;br /&gt;
                	        	A1[k * m * m + l + h * m] = C[h * m + l];&lt;br /&gt;
                	        }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	for(int k = 0; k &amp;lt; n; k++)&lt;br /&gt;
		for(int j = 0; j &amp;lt; m; j++)&lt;br /&gt;
			A[k * m + j] = A1[k * m + j];&lt;br /&gt;
      }&lt;br /&gt;
    double t2 = MPI_Wtime();&lt;br /&gt;
    MPI_Gather(P, n * m, MPI_DOUBLE, D, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    MPI_Gather(Q, n * m, MPI_DOUBLE, W, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    MPI_Gather(A, n * m, MPI_DOUBLE, V, n * m, MPI_DOUBLE, 0, MPI_COMM_WORLD);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Особенности реализации последовательного алгоритма === &lt;br /&gt;
Для оптимальности работы алгоритма следует реализовать функцию умножения матрицы отражения матрицы отражения на произвольную матрицу, это заметно сократит время время его работы.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&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;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</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:Diagram.png&amp;diff=28766</id>
		<title>Файл:Diagram.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:Diagram.png&amp;diff=28766"/>
		<updated>2021-12-12T20:10:35Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28757</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28757"/>
		<updated>2021-12-08T22:11:24Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n],&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; четное, то &amp;lt;math&amp;gt;D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; нечетное, то &amp;lt;math&amp;gt;D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2n - 2&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;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&amp;lt;br&amp;gt;Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и ее размер &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Выходные данные -- матрицы &amp;lt;math&amp;gt;P, Q, D,&amp;lt;/math&amp;gt; такие что &amp;lt;math&amp;gt;A = PDQ &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;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&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;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28756</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28756"/>
		<updated>2021-12-08T22:10:43Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n],&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; четное, то &amp;lt;math&amp;gt;D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; нечетное, то &amp;lt;math&amp;gt;D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2n - 2&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;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&amp;lt;br&amp;gt;Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и ее размер &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Выходные данные -- матрицы &amp;lt;math&amp;gt;P, Q, D,&amp;lt;/math&amp;gt; такие что &amp;lt;math&amp;gt;A = PDQ &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;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28755</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28755"/>
		<updated>2021-12-08T22:09:03Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n],&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; четное, то &amp;lt;math&amp;gt;D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; нечетное, то &amp;lt;math&amp;gt;D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2n - 2&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;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&amp;lt;br&amp;gt;Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &amp;lt;\math&amp;gt;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов является линейным.&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, линейна.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма == &lt;br /&gt;
=== Особенности реализации последовательного алгоритма === &lt;br /&gt;
Для оптимальности работы алгоритма следует реализовать функцию умножения матрицы отражения матрицы отражения на произвольную матрицу, это заметно сократит время время его работы.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28754</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28754"/>
		<updated>2021-12-08T22:07:57Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n],&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; четное, то &amp;lt;math&amp;gt;D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; нечетное, то &amp;lt;math&amp;gt;D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&amp;lt;br&amp;gt;Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &amp;lt;\math&amp;gt;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов является линейным.&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, линейна.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма == &lt;br /&gt;
=== Особенности реализации последовательного алгоритма === &lt;br /&gt;
Для оптимальности работы алгоритма следует реализовать функцию умножения матрицы отражения матрицы отражения на произвольную матрицу, это заметно сократит время время его работы.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28753</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28753"/>
		<updated>2021-12-08T22:07:30Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n],&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; четное, то &amp;lt;math&amp;gt;D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Если &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; нечетное, то &amp;lt;math&amp;gt;D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&amp;lt;br&amp;gt;Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &amp;lt;\math&amp;gt;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов является линейным.&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, линейна.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма == &lt;br /&gt;
=== Особенности реализации последовательного алгоритма === &lt;br /&gt;
Для оптимальности работы алгоритма следует реализовать функцию умножения матрицы отражения матрицы отражения на произвольную матрицу, это заметно сократит время время его работы.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28752</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28752"/>
		<updated>2021-12-08T22:03:10Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Свойства и структура алгоритмов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;/math&amp;gt;P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&amp;lt;br&amp;gt;Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &amp;lt;\math&amp;gt;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов является линейным.&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, линейна.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма == &lt;br /&gt;
=== Особенности реализации последовательного алгоритма === &lt;br /&gt;
Для оптимальности работы алгоритма следует реализовать функцию умножения матрицы отражения матрицы отражения на произвольную матрицу, это заметно сократит время время его работы.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28751</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28751"/>
		<updated>2021-12-08T22:02:11Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;/math&amp;gt;P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&amp;lt;br&amp;gt;Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &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;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28750</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28750"/>
		<updated>2021-12-08T22:01:20Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;/math&amp;gt;P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
&amp;lt;br&amp;gt;-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&amp;lt;br&amp;gt;Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &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;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28749</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28749"/>
		<updated>2021-12-08T22:00:10Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;/math&amp;gt;P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &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;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28748</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28748"/>
		<updated>2021-12-08T21:59:24Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;/math&amp;gt;P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
-- k ярусов с вычислением &amp;lt;math&amp;gt;4 * (n/k) - 4&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений, &lt;br /&gt;
-- k ярусов с вычислением &amp;lt;math&amp;gt;(4 * (n/k) - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &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;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28747</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28747"/>
		<updated>2021-12-08T21:58:36Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Последовательная сложность */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;/math&amp;gt;P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&amp;lt;math&amp;gt;2) 4 * n - 4 &amp;lt;/math&amp;gt;делений,&lt;br /&gt;
&amp;lt;math&amp;gt;3) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
&amp;lt;math&amp;gt;4) (4 * n - 4)(1 + n + n^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
-- k ярусов с вычислением 4 * (n/k) - 4 делений,&lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) умножений, &lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &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;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28746</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28746"/>
		<updated>2021-12-08T21:57:22Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;/math&amp;gt;P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2 вычислений квадратного корня,&lt;br /&gt;
2) 4 * n - 4 делений,&lt;br /&gt;
3) (4 * n - 4)(1 + n + n^2) умножений,&lt;br /&gt;
4) (4 * n - 4)(1 + n + n^2) сложений.&amp;lt;/math&amp;gt;&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
-- k ярусов с вычислением 4 * (n/k) - 4 делений,&lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) умножений, &lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &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;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28745</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28745"/>
		<updated>2021-12-08T21:55:38Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Последовательная сложность */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;/math&amp;gt;P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2 вычислений квадратного корня,&lt;br /&gt;
2) 4 * n - 4 делений,&lt;br /&gt;
3) (4 * n - 4)(1 + n + n^2) умножений,&lt;br /&gt;
4) (4 * n - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;\math&amp;gt;.&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
-- k ярусов с вычислением 4 * (n/k) - 4 делений,&lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) умножений, &lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &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;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28744</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28744"/>
		<updated>2021-12-08T21:54:40Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;/math&amp;gt;P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2 вычислений квадратного корня,&lt;br /&gt;
2) 4 * n - 4 делений,&lt;br /&gt;
3) (4 * n - 4)(1 + n + n^2) умножений,&lt;br /&gt;
4) (4 * n - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;\math&amp;gt;.&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;math&amp;gt; -- k ярусов с вычислением 4 * (n/k) - 4 делений,&lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) умножений, &lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Получим, что параллельная сложность алгоритма есть O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &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;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28743</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28743"/>
		<updated>2021-12-08T21:53:24Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;/math&amp;gt;P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2 вычислений квадратного корня,&lt;br /&gt;
2) 4 * n - 4 делений,&lt;br /&gt;
3) (4 * n - 4)(1 + n + n^2) умножений,&lt;br /&gt;
4) (4 * n - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;\math&amp;gt;.&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;math&amp;gt; -- k ярусов с вычислением 4 * (n/k) - 4 делений,&lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) умножений, &lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Получим, что параллельная сложность алгоритма есть O(n^2)&amp;lt;\math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &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;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28742</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28742"/>
		<updated>2021-12-08T03:24:56Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;/math&amp;gt;P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2 вычислений квадратного корня,&lt;br /&gt;
2) 4 * n - 4 делений,&lt;br /&gt;
3) (4 * n - 4)(1 + n + n^2) умножений,&lt;br /&gt;
4) (4 * n - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;\math&amp;gt;.&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;math&amp;gt; -- k ярусов с вычислением 4 * (n/k) - 4 делений,&lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) умножений, &lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;\math&amp;gt;&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &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;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28741</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28741"/>
		<updated>2021-12-08T03:24:01Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется бидиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;/math&amp;gt;P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для бидиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2 вычислений квадратного корня,&lt;br /&gt;
2) 4 * n - 4 делений,&lt;br /&gt;
3) (4 * n - 4)(1 + n + n^2) умножений,&lt;br /&gt;
4) (4 * n - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;\math&amp;gt;.&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;math&amp;gt; -- k ярусов с вычислением 4 * (n/k) - 4 делений,&lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) умножений, &lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;\math&amp;gt;&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &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;
Алгоритм бидиагонализации матрицы довольно последователен: на каждом шаге считается матрица отражения, и распараллелить прямым образом алгоритм нельзя, поскольку каждый раз матрица отражения строится к новой матрице. Однако можно разбить Матрицу &amp;lt;math&amp;gt; D&amp;lt;\math&amp;gt; на блоки, и каждый процесс будет занят умножением матрицы отражения на соответствующий блок.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
Параллельная реализация алгоритма наиболее эффективна на машинах с быстрым обменом данных меду процессами&lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28740</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28740"/>
		<updated>2021-12-08T03:14:08Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется двухдиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = PDQ&amp;lt;/math&amp;gt; для некоторых матриц &amp;lt;/math&amp;gt;P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для двухдиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2 вычислений квадратного корня,&lt;br /&gt;
2) 4 * n - 4 делений,&lt;br /&gt;
3) (4 * n - 4)(1 + n + n^2) умножений,&lt;br /&gt;
4) (4 * n - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;\math&amp;gt;.&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;math&amp;gt; -- k ярусов с вычислением 4 * (n/k) - 4 делений,&lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) умножений, &lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;\math&amp;gt;&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &amp;lt;\math&amp;gt;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов является линейным.&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, линейна.&lt;br /&gt;
== Программная реализация алгоритма == &lt;br /&gt;
=== Особенности реализации последовательного алгоритма === &lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28728</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28728"/>
		<updated>2021-12-06T23:57:47Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется двухдиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = P D Q&amp;lt;/math&amp;gt; для некоторых матриц P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы первого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для двухдиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2 вычислений квадратного корня,&lt;br /&gt;
2) 4 * n - 4 делений,&lt;br /&gt;
3) (4 * n - 4)(1 + n + n^2) умножений,&lt;br /&gt;
4) (4 * n - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;\math&amp;gt;.&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;math&amp;gt; -- k ярусов с вычислением 4 * (n/k) - 4 делений,&lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) умножений, &lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;\math&amp;gt;&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P D Q &amp;lt;\math&amp;gt;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов является линейным.&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, линейна.&lt;br /&gt;
== Программная реализация алгоритма == &lt;br /&gt;
=== Особенности реализации последовательного алгоритма === &lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации === &lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур === &lt;br /&gt;
=== Существующие реализации архитектур === &lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28727</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28727"/>
		<updated>2021-12-06T23:00:33Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: /* Свойства и структура алгоритмов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется двухдиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = P \times D \times Q&amp;lt;/math&amp;gt; для некоторых матриц P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы вервого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = \frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = \frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для двухдиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2 вычислений квадратного корня,&lt;br /&gt;
2) 4 * n - 4 делений,&lt;br /&gt;
3) (4 * n - 4)(1 + n + n^2) умножений,&lt;br /&gt;
4) (4 * n - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;\math&amp;gt;.&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;math&amp;gt; -- k ярусов с вычислением 4 * (n/k) - 4 делений,&lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) умножений, &lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;\math&amp;gt;&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P * D * Q &amp;lt;\math&amp;gt;&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов является линейным.&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, линейна.&lt;br /&gt;
&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28726</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28726"/>
		<updated>2021-12-06T22:42:31Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Вычисляется двухдиагональная матрица D размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;A = P \times D \times Q&amp;lt;/math&amp;gt; для некоторых матриц P и Q, являющихся произведением некоторого числа матриц отражения.Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы вервого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
Формулы метода:&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = [a_1, a_2, ..., a_n]&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i четное, то D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2}, Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Если i нечетное, то D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u_i = frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Вычислительное дро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет нахождение на каждом этапе матрицы отражения(всего &amp;lt;math&amp;gt;2 * n - 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
=== Макроструктура алгоритма === &lt;br /&gt;
Операции скалярного произведения, умножения матрицы на вектор &lt;br /&gt;
=== Схема реализации последовательного алгоритма === &lt;br /&gt;
&amp;lt;math&amp;gt;D_1 = A, P_1 = I, Q_1 = I.&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;1) для четного  i : D_i = D_{i-1} * (I - 2 * u_{i-1} * u_{i-1}^*), Q_i = (I - 2 * u_{i} * u_{i}^*) * Q_{i-1}, P_i = P_{i-1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : D_i = (I - 2 * u_{i-1} * u_{i-1}^*) * D_{i-1}, Q_i = Q_{i-1}, P_i = P_{i-1} * (I - 2 * u_{i} * u_{i}^*).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;2) для четного  i : u_i = frac{[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]}{||[0, 0, ..., 0, d_{i+1} - ||d_{i+1}||_2, d_{i+2}, ..., d_n]||_2},&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; для нечетного  i : u_i = frac{[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]}{||[0, 0, ..., 0, d_i - ||d_i||_2, d_{i+1}, ..., d_n]||_2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Последовательная сложность ===&lt;br /&gt;
Для двухдиагонализации матрицы порядка n методом отражений при последовательном варианте требуется:&lt;br /&gt;
&amp;lt;math&amp;gt;1) 2 * n - 2 вычислений квадратного корня,&lt;br /&gt;
2) 4 * n - 4 делений,&lt;br /&gt;
3) (4 * n - 4)(1 + n + n^2) умножений,&lt;br /&gt;
4) (4 * n - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Сложность последовательного алгоритма есть &amp;lt;math&amp;gt;O(n^3)&amp;lt;\math&amp;gt;.&lt;br /&gt;
=== Информационный граф === &lt;br /&gt;
=== При параллельном вычислении двухдиагональной матрицы методом отражений требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&amp;lt;math&amp;gt; -- k ярусов с вычислением 4 * (n/k) - 4 делений,&lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) умножений, &lt;br /&gt;
-- k ярусов с вычислением (4 * (n/k) - 4)(1 + n + n^2) сложений.&lt;br /&gt;
Получим, что параллельная сложность алгоритма есть &amp;lt;math&amp;gt;O(n^2)&amp;lt;\math&amp;gt;&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
На вход подается матрица A и ее размер n. Выходные данные -- матрицы P, Q, D, такие что &amp;lt;math&amp;gt;A = P * D * Q &amp;lt;\math&amp;gt;&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28617</id>
		<title>Участник:Малков Кирилл/Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9C%D0%B0%D0%BB%D0%BA%D0%BE%D0%B2_%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28617"/>
		<updated>2021-10-26T19:07:42Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: Новая страница: «== Свойства и структура алгоритмов == === Общее описание алгоритма === Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt;...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы вервого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28615</id>
		<title>Алгоритм бидиагонализации матрицы методом отражений</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B1%D0%B8%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BE%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=28615"/>
		<updated>2021-10-26T19:05:00Z</updated>

		<summary type="html">&lt;p&gt;Малков Кирилл: Новая страница: «== Свойства и структура алгоритмов == === Общее описание алгоритма === Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt;...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;B = [b_{ij}]&amp;lt;/math&amp;gt; называется (верхней) двухдиагональной, или бидиагональной, если &amp;lt;math&amp;gt;b_{ij} = 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i &amp;gt; j&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;i + 1 &amp;lt; j&amp;lt;/math&amp;gt;. Алгоритм бидиагонализации матрицы методом отражений приводит произвольную &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; матрицу A к бидиагональному виду&lt;br /&gt;
&amp;lt;math&amp;gt;B = PAQ&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - произведения конечного числа матриц отражения(или вращения).&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть дана матрица A размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Сначала мы умножаем A слева на матрицу отражения, аннулирующую все поддиагональные элементы вервого столбца. Затем умножаем результат справа на матрицу отражения, аннулирующую элементы первой строки в позициях с 3-й по n-ю. Далее умножением слева аннулируем все поддиагональные элементы второго столбца, затем умножением справа аннулируем получаем нули во второй строке в позициях с 4-й по n-ю и т.д. После каждого умножения на матрицу отражения все ранее полученные нули остаются.&lt;br /&gt;
== Литература == &lt;br /&gt;
Е. Е. Тыртышников, &amp;quot;Методы численного анализа&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Малков Кирилл</name></author>
	</entry>
</feed>