行列のべき乗のためのO(log n)アルゴリズムはありますか?


9

行列をO(\ log n)時間で乗するアルゴリズムはありますか?nO(logn)

私はオンラインで検索してきましたが、今のところ失敗しています。


1
固定サイズのマトリックスがあるということですか?実際、マトリックスのサイズがm場合、O(log n)アルゴリズムを見つけることは期待できません。

人々は通常、この問題を行列の力と呼んでいます。行列のべき乗とは、e ^ Xを見つけることを意味しますeX
Shitikanth、

@Shitikanth Ok、ありがとう。私は今それを変えましょう。
ジャックH

回答:


11

以下は、行列べき乗アルゴリズムの疑似コードです。*演算子は通常の行列乗算を示すことに注意してください。O(lgn)

MATHPOWER (M, n)
if n == 1
    then return M
else
    P = MATHPOWER (M, floor(n/2))
    if n mod 2 == 0
        then return P * P
    else
        return P * P * M

未来から来る人にとって、これは恐ろしい答えです。代わりにO(n ^ 3)アルゴリズムがある場合、O(n ^ 3 * log(n))は機能します。以下のYuvalからの回答を参照してください。実際問題として、これは通常、SVD分解によって行われ、D行列のN要素を累乗し、行列を再度乗算します。
マイケルO

@Michael O、あなたは本当にポイントを逃したと思います。あなたはOP、すなわち、どのように行列を高めるために、求めていたものを誤解乗で。重要なのは、OPでは、実行されるステップ数がであることだけが必要 であり、全体の複雑さではなく、行列の順序も考慮する必要があるためです。nO(lgn)stepsO(lgn)
Massimo Cafaro、

この場合、対応する漸化式はあるため、提案された分割統治アプローチは、行列の順序が場合にのみ、最悪の場合の複雑さ持ちます。(例として、3 x 3マトリックスの場合、マトリックスの乗算は、定数のスカラー乗算および加算を使用して実行できます)。私が与えたアルゴリズムの1つの可能な適用は、エントリがある行列を試して、番目のフィボナッチ数を計算することです。の乗。O(lgn)O(1)T(n)=T(n/2)+O(1)na11=1,a12=1,a21=1,a22=0n
Massimo Cafaro、

最後に、これはすでに整理され、完全に理解されていることにも注意してください。@ user742によって提供された質問へのコメントを見てください。
Massimo Cafaro、

7

他の2つのアルゴリズムが関連する場合とそうでない場合があります。最初のアルゴリズムは行列を対角化し(通常は可能)、として書き込みます。ここで、は一般に複素数値である場合があります。次に計算します。対角行列を乗するのは非常に簡単です。が対角化できない場合は、そのヨルダン形式を見つけて、以前と同様に続行します(今度は、いくつかの二項係数も計算する必要があります)。このアルゴリズムはおそらく数値的に安定していません。M=PDP1M,DM=PDnP1nM

別のアルゴリズムは、がその特性多項式(または最小多項式)を満たすという事実を使用します。いくつかのについてと仮定します特性多項式としましょう)。その後、我々は計算することができる上次いで置換。つまり、という事実を使用してを多項式として計算し、最後にのみの値を代入します。すべての必要な累乗と、のすべての値を事前計算することもできますMP(M)=0PMnR[M]/(P(M))MMnP(M)=0MMMk(modP(M))k<2degP1、そしてこのアルゴリズムはMassimo Cafaroの答えであるアルゴリズムよりも高速である可能性があります。以前のアルゴリズムより数値的に安定している可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.