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

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

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

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

Пусть A, B — матрицы размеров m×n и n×p соответственно. Тогда для вычисления матрицы C=AB достаточно параллельно вычислить cij=k=1naikbkj для всех 1im, 1jp.

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

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

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

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

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

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

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

𝐋1=(𝐋1,110𝐋2,21𝐋2,1𝐋1,11𝐋2,21).

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

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

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

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

T(n)=O(log2n).

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

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

χ(λ)=det(AλE)=(λλ1)(λλn)=λns1λn1+s2λn2+...+(1)nsn,

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

s1=λ1+λ2++λn=trAслед матрицы,
sn=λ1λ2λn=detAопределитель матрицы.

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

fkm=1i1<i2<<iknj{i1,i2,,ik}(λi1λi2λik)λjm.

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

sktrAm=(1i1<i2<<iknλi1λi2λik)(j=1nλjm)=1i1<i2<<ikn1jn(λi1λi2λik)λjm==1i1<i2<<iknj{i1,i2,,ik}(λi1λi2λik)λjm+1i1<i2<<iknj{i1,i2,,ik}(λi1λi2λik)λjm=fkm+fk1m+1

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

sktrA0sk1trA1+sk2trA2++(1)k1s1trAk1+(1)ktrAk==(fk0+fk11)(fk11+fk22)+(fk22+fk33)++(1)k1(f1k1+f0k)+(1)kf0k==fk0+(fk11fk11)(fk22fk22)++(1)k2(f1k1f1k1)+(1)k1(f0kf0k)=fk0=(nk)sk

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

ksksk1trA1+sk2trA2++(1)k1s1trAk1=(1)k1trAk

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

(10000trA2000trA2trA300(1)n2trAn2(1)n3trAn3(1)n4trAn4(n1)0(1)n1trAn1(1)n2trAn2(1)n3trAn3trAn)(s1s2s3sn1sn)=(trAtrA2trA3(1)n2trAn1(1)n1trAn)

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

Примечания

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

Литература

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