Алгоритм Чанки [ 1] [ 2] — это алгоритм, позволяющий решать задачу вычисления определителя матрицы в классе NC . Идея алгоритма состоит в том, чтобы свести исходную задачу к решению системы
L
s
=
t
{\displaystyle Ls=t}
относительно вектора
s
{\displaystyle s}
, где
L
{\displaystyle L}
— нижнетреугольная матрица, которую можно обратить за время
T
(
n
)
=
O
(
log
2
n
)
{\displaystyle T(n)=O(\log ^{2}n)}
с использованием
O
(
n
4
)
{\displaystyle O(n^{4})}
процессоров.
Пусть
A
{\displaystyle A}
,
B
{\displaystyle B}
— матрицы размеров
m
×
n
{\displaystyle m\times n}
и
n
×
p
{\displaystyle n\times p}
соответственно. Тогда для вычисления матрицы
C
=
A
B
{\displaystyle C=AB}
достаточно параллельно вычислить
c
i
j
=
∑
k
=
1
n
a
i
k
⋅
b
k
j
{\textstyle c_{ij}=\sum _{k=1}^{n}a_{ik}\cdot b_{kj}}
для всех
1
≤
i
≤
m
{\displaystyle 1\leq i\leq m}
,
1
≤
j
≤
p
{\displaystyle 1\leq j\leq p}
.
Префиксные суммы в выражениях такого вида могут быть вычислены за время
O
(
log
n
)
{\displaystyle O(\log n)}
с применением
O
(
n
)
{\displaystyle O(n)}
параллельных процессоров. Таким образом, используя
O
(
m
n
p
)
{\displaystyle O(mnp)}
процессоров, можно вычислить всю матрицу
A
B
{\displaystyle AB}
за время
O
(
log
n
)
{\displaystyle O(\log n)}
.
Применяя схожую процедуру для вычисления
A
n
=
A
⋅
A
⋅
…
⋅
A
{\textstyle A^{n}=A\cdot A\cdot \ldots \cdot A}
, можно вычислить все степени матрицы, не превосходящие
n
{\displaystyle n}
, что потребует
O
(
log
n
)
⋅
M
(
n
)
=
O
(
log
2
n
)
{\textstyle O(\log n)\cdot M(n)=O(\log ^{2}n)}
времени и
O
(
n
4
)
{\textstyle O(n^{4})}
процессоров.
Здесь
M
(
n
)
{\displaystyle M(n)}
— время, необходимое для умножения двух квадратных матриц размера
n
×
n
{\displaystyle n\times n}
.
Нижнетреугольную матрицу
L
{\displaystyle L}
размера
n
×
n
{\displaystyle n\times n}
можно разбить на равные по размеру блоки
L
=
(
L
1
,
1
0
L
2
,
1
L
2
,
2
)
{\displaystyle \mathbf {L} ={\begin{pmatrix}\mathbf {L} _{1,1}&0\\\mathbf {L} _{2,1}&\mathbf {L} _{2,2}\end{pmatrix}}}
,
тогда обратная к ней матрица
L
−
1
{\displaystyle L^{-1}}
примет вид
L
−
1
=
(
L
1
,
1
−
1
0
−
L
2
,
2
−
1
L
2
,
1
L
1
,
1
−
1
L
2
,
2
−
1
)
{\displaystyle \mathbf {L} ^{-1}={\begin{pmatrix}\mathbf {L} _{1,1}^{-1}&0\\\mathbf {-L} _{2,2}^{-1}\mathbf {L} _{2,1}^{}\mathbf {L} _{1,1}^{-1}&\mathbf {L} _{2,2}^{-1}\end{pmatrix}}}
.
Это означает, что задачу обращения матрицы
L
{\displaystyle L}
можно решить путём двух параллельно выполняемых обращений нижнетреугольных матриц
L
1
,
1
{\displaystyle L_{1,1}}
и
L
2
,
2
{\displaystyle L_{2,2}}
размера
[
n
2
]
×
[
n
2
]
{\textstyle \left[{\frac {n}{2}}\right]\times \left[{\frac {n}{2}}\right]}
и двух последовательно выполняемых умножений.
Пусть
T
(
n
)
{\displaystyle T(n)}
— время, требуемое для обращения нижнетреугольной матрицы
n
×
n
{\displaystyle n\times n}
. Оно подчиняется рекуррентному соотношению
T
(
n
)
≤
T
(
n
2
)
+
2
M
(
n
2
)
{\displaystyle T(n)\leq T\left({\frac {n}{2}}\right)+2M\left({\frac {n}{2}}\right)}
.
Выше показано, что
M
(
n
)
=
O
(
log
n
)
{\displaystyle M(n)=O(\log n)}
, поэтому окончательная оценка, в силу основной теоремы о рекуррентных оценках , равна
T
(
n
)
=
O
(
log
2
n
)
{\displaystyle T(n)=O(\log ^{2}n)}
.
Пусть
A
{\displaystyle A}
— квадратная матрица со стороной
n
{\displaystyle n}
. Её характеристический многочлен имеет вид
χ
(
λ
)
=
det
(
A
−
λ
E
)
=
(
λ
−
λ
1
)
…
(
λ
−
λ
n
)
=
λ
n
−
s
1
λ
n
−
1
+
s
2
λ
n
−
2
+
.
.
.
+
(
−
1
)
n
s
n
{\displaystyle {\begin{aligned}\chi (\lambda )=\det(A-\lambda E)=(\lambda -\lambda _{1})\dots (\lambda -\lambda _{n})=\lambda ^{n}-s_{1}\lambda ^{n-1}+s_{2}\lambda ^{n-2}+...+(-1)^{n}s_{n}\end{aligned}}}
,
где
s
k
{\displaystyle s_{k}}
— элементарные симметрический многочлен степени
k
{\displaystyle k}
, а
λ
i
{\displaystyle \lambda _{i}}
— собственные значения матрицы
A
{\displaystyle A}
. В частности,
s
1
=
λ
1
+
λ
2
+
…
+
λ
n
=
t
r
A
{\displaystyle s_{1}=\lambda _{1}+\lambda _{2}+\ldots +\lambda _{n}=\mathrm {tr} A}
— след матрицы ,
s
n
=
λ
1
⋅
λ
2
⋅
…
⋅
λ
n
=
det
A
{\displaystyle s_{n}=\lambda _{1}\cdot \lambda _{2}\cdot \ldots \cdot \lambda _{n}=\det A}
— определитель матрицы .
Для удобства вводится
s
0
=
1
{\displaystyle s_{0}=1}
и введём вспомогательную величину
f
k
m
{\displaystyle f_{k}^{m}}
, такую что
f
k
m
=
∑
1
≤
i
1
<
i
2
<
…
<
i
k
≤
n
j
∉
{
i
1
,
i
2
,
…
,
i
k
}
(
λ
i
1
⋅
λ
i
2
⋅
…
⋅
λ
i
k
)
⋅
λ
j
m
{\displaystyle f_{k}^{m}=\sum _{1\leq i_{1}<i_{2}<\ldots <i_{k}\leq n \atop j\notin \{i_{1},i_{2},\ldots ,i_{k}\}}(\lambda _{i_{1}}\cdot \lambda _{i_{2}}\cdot \ldots \cdot \lambda _{i_{k}})\cdot \lambda _{j}^{m}}
.
С учётом
t
r
A
m
=
∑
j
=
1
n
λ
j
m
{\displaystyle \mathrm {tr} A^{m}=\sum _{j=1}^{n}\lambda _{j}^{m}}
, можно выразить
s
k
⋅
t
r
A
m
=
(
∑
1
≤
i
1
<
i
2
<
…
<
i
k
≤
n
λ
i
1
⋅
λ
i
2
⋅
…
⋅
λ
i
k
)
⋅
(
∑
j
=
1
n
λ
j
m
)
=
∑
1
≤
i
1
<
i
2
<
…
<
i
k
≤
n
1
≤
j
≤
n
(
λ
i
1
⋅
λ
i
2
⋅
…
⋅
λ
i
k
)
⋅
λ
j
m
=
=
∑
1
≤
i
1
<
i
2
<
…
<
i
k
≤
n
j
∉
{
i
1
,
i
2
,
…
,
i
k
}
(
λ
i
1
⋅
λ
i
2
⋅
…
⋅
λ
i
k
)
⋅
λ
j
m
+
∑
1
≤
i
1
<
i
2
<
…
<
i
k
≤
n
j
∈
{
i
1
,
i
2
,
…
,
i
k
}
(
λ
i
1
⋅
λ
i
2
⋅
…
⋅
λ
i
k
)
⋅
λ
j
m
=
f
k
m
+
f
k
−
1
m
+
1
{\displaystyle {\begin{aligned}s_{k}\cdot \mathrm {tr} A^{m}=\left(\sum _{1\leq i_{1}<i_{2}<\ldots <i_{k}\leq n}\lambda _{i_{1}}\cdot \lambda _{i_{2}}\cdot \ldots \cdot \lambda _{i_{k}}\right)\cdot \left(\sum _{j=1}^{n}\lambda _{j}^{m}\right)=\sum _{1\leq i_{1}<i_{2}<\ldots <i_{k}\leq n \atop 1\leq j\leq n}(\lambda _{i_{1}}\cdot \lambda _{i_{2}}\cdot \ldots \cdot \lambda _{i_{k}})\cdot \lambda _{j}^{m}=\\=\sum _{1\leq i_{1}<i_{2}<\ldots <i_{k}\leq n \atop j\notin \{i_{1},i_{2},\ldots ,i_{k}\}}(\lambda _{i_{1}}\cdot \lambda _{i_{2}}\cdot \ldots \cdot \lambda _{i_{k}})\cdot \lambda _{j}^{m}+\sum _{1\leq i_{1}<i_{2}<\ldots <i_{k}\leq n \atop j\in \{i_{1},i_{2},\ldots ,i_{k}\}}(\lambda _{i_{1}}\cdot \lambda _{i_{2}}\cdot \ldots \cdot \lambda _{i_{k}})\cdot \lambda _{j}^{m}=f_{k}^{m}+f_{k-1}^{m+1}\end{aligned}}}
Используя данное соотношение, можно записать
s
k
⋅
t
r
A
0
−
s
k
−
1
⋅
t
r
A
1
+
s
k
−
2
⋅
t
r
A
2
+
…
+
(
−
1
)
k
−
1
s
1
⋅
t
r
A
k
−
1
+
(
−
1
)
k
t
r
A
k
=
=
(
f
k
0
+
f
k
−
1
1
)
−
(
f
k
−
1
1
+
f
k
−
2
2
)
+
(
f
k
−
2
2
+
f
k
−
3
3
)
+
…
+
(
−
1
)
k
−
1
(
f
1
k
−
1
+
f
0
k
)
+
(
−
1
)
k
f
0
k
=
=
f
k
0
+
(
f
k
−
1
1
−
f
k
−
1
1
)
−
(
f
k
−
2
2
−
f
k
−
2
2
)
+
…
+
(
−
1
)
k
−
2
(
f
1
k
−
1
−
f
1
k
−
1
)
+
(
−
1
)
k
−
1
(
f
0
k
−
f
0
k
)
=
f
k
0
=
(
n
−
k
)
s
k
{\displaystyle {\begin{aligned}&s_{k}\cdot \mathrm {tr} A^{0}-s_{k-1}\cdot \mathrm {tr} A^{1}+s_{k-2}\cdot \mathrm {tr} A^{2}+\ldots +(-1)^{k-1}s_{1}\cdot \mathrm {tr} A^{k-1}+(-1)^{k}\mathrm {tr} A^{k}=\\&=(f_{k}^{0}+f_{k-1}^{1})-(f_{k-1}^{1}+f_{k-2}^{2})+(f_{k-2}^{2}+f_{k-3}^{3})+\ldots +(-1)^{k-1}(f_{1}^{k-1}+f_{0}^{k})+(-1)^{k}f_{0}^{k}=\\&=f_{k}^{0}+(f_{k-1}^{1}-f_{k-1}^{1})-(f_{k-2}^{2}-f_{k-2}^{2})+\ldots +(-1)^{k-2}(f_{1}^{k-1}-f_{1}^{k-1})+(-1)^{k-1}(f_{0}^{k}-f_{0}^{k})=f_{k}^{0}=(n-k)s_{k}\end{aligned}}}
Таким образом, для произвольного
k
{\displaystyle k}
справедливо
k
s
k
−
s
k
−
1
⋅
t
r
A
1
+
s
k
−
2
⋅
t
r
A
2
+
…
+
(
−
1
)
k
−
1
s
1
⋅
t
r
A
k
−
1
=
(
−
1
)
k
−
1
t
r
A
k
{\displaystyle ks_{k}-s_{k-1}\cdot \mathrm {tr} A^{1}+s_{k-2}\cdot \mathrm {tr} A^{2}+\ldots +(-1)^{k-1}s_{1}\cdot \mathrm {tr} A^{k-1}=(-1)^{k-1}\mathrm {tr} A^{k}}
или в матричном виде
(
1
0
0
…
0
0
−
t
r
A
2
0
…
0
0
t
r
A
2
−
t
r
A
3
…
0
0
⋮
⋮
⋮
⋱
⋮
⋮
(
−
1
)
n
−
2
t
r
A
n
−
2
(
−
1
)
n
−
3
t
r
A
n
−
3
(
−
1
)
n
−
4
t
r
A
n
−
4
…
(
n
−
1
)
0
(
−
1
)
n
−
1
t
r
A
n
−
1
(
−
1
)
n
−
2
t
r
A
n
−
2
(
−
1
)
n
−
3
t
r
A
n
−
3
…
−
t
r
A
n
)
(
s
1
s
2
s
3
⋮
s
n
−
1
s
n
)
=
(
t
r
A
−
t
r
A
2
t
r
A
3
⋮
(
−
1
)
n
−
2
t
r
A
n
−
1
(
−
1
)
n
−
1
t
r
A
n
)
{\displaystyle {\begin{pmatrix}1&0&0&\ldots &0&0\\-\mathrm {tr} A&2&0&\ldots &0&0\\\mathrm {tr} A^{2}&-\mathrm {tr} A&3&\ldots &0&0\\\vdots &\vdots &\vdots &\ddots &\vdots &\vdots \\(-1)^{n-2}\mathrm {tr} A^{n-2}&(-1)^{n-3}\mathrm {tr} A^{n-3}&(-1)^{n-4}\mathrm {tr} A^{n-4}&\ldots &(n-1)&0\\(-1)^{n-1}\mathrm {tr} A^{n-1}&(-1)^{n-2}\mathrm {tr} A^{n-2}&(-1)^{n-3}\mathrm {tr} A^{n-3}&\ldots &-\mathrm {tr} A&n\end{pmatrix}}{\begin{pmatrix}s_{1}\\s_{2}\\s_{3}\\\vdots \\s_{n-1}\\s_{n}\end{pmatrix}}={\begin{pmatrix}\mathrm {tr} A\\-\mathrm {tr} A^{2}\\\mathrm {tr} A^{3}\\\vdots \\(-1)^{n-2}\mathrm {tr} A^{n-1}\\(-1)^{n-1}\mathrm {tr} A^{n}\end{pmatrix}}}
Для решения этой системы нужно обратить нижнетреугольную матрицу в левой части и умножить её на столбец из правой — все эти операции вместе с одновременным вычислением значений вида
t
r
A
k
{\displaystyle \mathrm {tr} A^{k}}
для всех
k
∈
{
1
,
2
,
…
,
n
}
{\displaystyle k\in \{1,2,\ldots ,n\}}
могут быть выполнены за время
O
(
log
2
n
)
{\displaystyle O(\log ^{2}n)}
с использованием
O
(
n
4
)
{\displaystyle O(n^{4})}
процессоров. Получив решение
s
=
(
s
1
s
2
…
s
n
)
T
{\displaystyle s={\begin{pmatrix}s_{1}&s_{2}&\dots &s_{n}\end{pmatrix}}^{T}}
, остаётся лишь взять последний элемент
s
n
{\displaystyle s_{n}}
, который равен искомому
det
A
{\displaystyle \det A}
.
↑ Csanky, L.: Almost parallel matrix inversion algorithms. SIAM 618–623 (1976)
↑ Солтис, 2019
Kozen, Dexter (1991), The Design and Analysis of Algorithms , New York: Springer-Verlag, pp. 166–170, ISBN 0-387-97687-6
Солтис М. Алгоритм Чанки // Введение в анализ алгоритмов / пер. с англ. А. В. Логунова. — М. : ДМК Пресс, 2019. — С. 145—146. — 278 с. — ISBN 978-5-97060-696-4 .