Алгоритм Чанки

Материал из testwiki
Перейти к навигации Перейти к поиску

Алгоритм Чанки[1][2] — это алгоритм, позволяющий решать задачу вычисления определителя матрицы в классе NC. Идея алгоритма состоит в том, чтобы свести исходную задачу к решению системы Ls=t относительно вектора s, где L — нижнетреугольная матрица, которую можно обратить за время T(n)=O(log2n) с использованием O(n4) процессоров.

Параллельное возведение в степень

Пусть A, B — матрицы размеров m×n и n×p соответственно. Тогда для вычисления матрицы C=AB достаточно параллельно вычислить cij=∑k=1naik⋅bkj для всех 1≤i≤m, 1≤j≤p.

Префиксные суммы в выражениях такого вида могут быть вычислены за время O(log⁡n) с применением O(n) параллельных процессоров. Таким образом, используя O(mnp) процессоров, можно вычислить всю матрицу AB за время O(log⁡n).

Применяя схожую процедуру для вычисления An=A⋅A⋅…⋅A, можно вычислить все степени матрицы, не превосходящие n, что потребует O(log⁡n)⋅M(n)=O(log2n) времени и O(n4) процессоров.

Здесь M(n) — время, необходимое для умножения двух квадратных матриц размера n×n.

Обращение нижнетреугольной матрицы

Нижнетреугольную матрицу L размера n×n можно разбить на равные по размеру блоки

𝐋=(𝐋1,10𝐋2,1𝐋2,2),

тогда обратная к ней матрица L−1 примет вид

𝐋−1=(𝐋1,1−10−𝐋2,2−1𝐋2,1𝐋1,1−1𝐋2,2−1).

Это означает, что задачу обращения матрицы L можно решить путём двух параллельно выполняемых обращений нижнетреугольных матриц L1,1 и L2,2 размера [n2]×[n2] и двух последовательно выполняемых умножений.

Пусть T(n) — время, требуемое для обращения нижнетреугольной матрицы n×n. Оно подчиняется рекуррентному соотношению

T(n)≤T(n2)+2M(n2).

Выше показано, что M(n)=O(log⁡n), поэтому окончательная оценка, в силу основной теоремы о рекуррентных оценках, равна

T(n)=O(log2n).

Описание метода

Пусть A — квадратная матрица со стороной n. Её характеристический многочлен имеет вид

χ(λ)=det⁡(A−λE)=(λ−λ1)…(λ−λn)=λn−s1λn−1+s2λn−2+...+(−1)nsn,

где sk — элементарные симметрический многочлен степени k, а λi — собственные значения матрицы A. В частности,

s1=λ1+λ2+…+λn=trA — след матрицы,
sn=λ1⋅λ2⋅…⋅λn=det⁡A — определитель матрицы.

Для удобства вводится s0=1 и введём вспомогательную величину fkm, такую что

fkm=∑1≤i1<i2<…<ik≤nj∉{i1,i2,…,ik}(λi1⋅λi2⋅…⋅λik)⋅λjm.

С учётом trAm=∑j=1nλjm, можно выразить

sk⋅trAm=(∑1≤i1<i2<…<ik≤nλi1⋅λi2⋅…⋅λik)⋅(∑j=1nλjm)=∑1≤i1<i2<…<ik≤n1≤j≤n(λi1⋅λi2⋅…⋅λik)⋅λjm==∑1≤i1<i2<…<ik≤nj∉{i1,i2,…,ik}(λi1⋅λi2⋅…⋅λik)⋅λjm+∑1≤i1<i2<…<ik≤nj∈{i1,i2,…,ik}(λi1⋅λi2⋅…⋅λik)⋅λjm=fkm+fk−1m+1

Используя данное соотношение, можно записать

sk⋅trA0−sk−1⋅trA1+sk−2⋅trA2+…+(−1)k−1s1⋅trAk−1+(−1)ktrAk==(fk0+fk−11)−(fk−11+fk−22)+(fk−22+fk−33)+…+(−1)k−1(f1k−1+f0k)+(−1)kf0k==fk0+(fk−11−fk−11)−(fk−22−fk−22)+…+(−1)k−2(f1k−1−f1k−1)+(−1)k−1(f0k−f0k)=fk0=(n−k)sk

Таким образом, для произвольного k справедливо

ksk−sk−1⋅trA1+sk−2⋅trA2+…+(−1)k−1s1⋅trAk−1=(−1)k−1trAk

или в матричном виде

(100…00−trA20…00trA2−trA3…00⋮⋮⋮⋱⋮⋮(−1)n−2trAn−2(−1)n−3trAn−3(−1)n−4trAn−4…(n−1)0(−1)n−1trAn−1(−1)n−2trAn−2(−1)n−3trAn−3…−trAn)(s1s2s3⋮sn−1sn)=(trA−trA2trA3⋮(−1)n−2trAn−1(−1)n−1trAn)

Для решения этой системы нужно обратить нижнетреугольную матрицу в левой части и умножить её на столбец из правой — все эти операции вместе с одновременным вычислением значений вида trAk для всех k∈{1,2,…,n} могут быть выполнены за время O(log2n) с использованием O(n4) процессоров. Получив решение s=(s1s2…sn)T, остаётся лишь взять последний элемент sn, который равен искомому det⁡A.

Примечания

Шаблон:Примечания

Литература

  1. ↑ Csanky, L.: Almost parallel matrix inversion algorithms. SIAM 618–623 (1976)
  2. ↑ Шаблон:Sfn-текст