Gibt es einen O (log n) -Algorithmus für die Matrixexponentiation?

9

Gibt es einen Algorithmus, um eine Matrix in Zeit auf die te Potenz zu bringen ?nO(logn)

Ich habe online gesucht, war aber bisher erfolglos.

Jack H.
quelle
1
Sie meinen, Sie haben eine Matrix mit fester Größe? Wenn Ihre Matrix die Größe hat, können Sie nicht erwarten, einen O (log \ n) -Algorithmus zu finden. mO(log n)
Menschen bezeichnen dieses Problem normalerweise als Matrix-Powering. Matrixexponentiation bedeutet, eX
Shitikanth
@ Shitikanth Ok, danke. Ich werde das jetzt ändern.
Jack H

Antworten:

11

Hier ist der Pseudocode für einen -Matrix-Exponentiationsalgorithmus. Beachten Sie, dass der Operator * die gewöhnliche Matrixmultiplikation bezeichnet.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
Massimo Cafaro
quelle
Für Menschen aus der Zukunft ist dies eine schreckliche Antwort. Es funktioniert O (n ^ 3 * log (n)), wenn stattdessen O (n ^ 3) -Algorithmen vorhanden sind. Siehe die Antwort von Yuval unten. In der Praxis erfolgt dies normalerweise durch SVD-Zerlegung, dann Anheben der N Elemente der D-Matrix auf die Potenz und erneutes Multiplizieren der Matrix.
Michael O
@ Michael O, ich denke du hast den Punkt wirklich verpasst. Sie haben falsch verstanden, wonach das OP gefragt hat, dh wie eine Matrix in auf die te Potenz . Der Schlüssel ist, dass das OP nur verlangt, dass die Anzahl der durchgeführten Schritte , nicht die Gesamtkomplexität, da dies auch die Berücksichtigung der Matrixreihenfolge erfordern würde. nO(lgn)stepsO(lgn)
Massimo Cafaro
Es ist offensichtlich, dass der vorgeschlagene Divide and Conquer-Ansatz nur dann die Worst-Case-Komplexität , wenn die Matrixreihenfolge , da in diesem Fall die entsprechende Wiederholungsgleichung (als Beispiel kann für eine 3 × 3-Matrix eine Matrixmultiplikation unter Verwendung einer konstanten Anzahl von Skalarmultiplikationen und -additionen durchgeführt werden). Eine mögliche Anwendung des von mir angegebenen Algorithmus besteht darin, die te Fibonacci-Zahl zu berechnen , indem die Matrix mit den Einträgen berechnet wird nach der ten Potenz. O(lgn)O(1)T(n)=T(n/2)+O(1)na11=1,a12=1,a21=1,a22=0n
Massimo Cafaro
Beachten Sie zum Schluss auch, dass dies bereits geklärt und vollständig verstanden wurde: Schauen Sie sich einfach den Kommentar zu der Frage von @ user742 an.
Massimo Cafaro
7

Es gibt zwei andere Algorithmen, die relevant sein können oder nicht. Der erste Algorithmus diagonalisiert Ihre Matrix (was normalerweise möglich ist) und schreibt sie als , wobei im Allgemeinen einen komplexen Wert haben kann. Sie berechnen dann . Beachten Sie, dass es sehr einfach ist, eine Diagonalmatrix auf die te Potenz anzuheben . Wenn nicht diagonalisierbar ist, finden Sie seine Jordan-Form und fahren wie zuvor fort (jetzt müssen Sie auch einige Binomialkoeffizienten berechnen). Dieser Algorithmus ist wahrscheinlich nicht numerisch stabil.M=PDP1M,DM=PDnP1nM

Ein anderer Algorithmus nutzt die Tatsache, dass sein charakteristisches Polynom (oder sogar sein minimales Polynom) erfüllt. Angenommen, für einige , sagen wir das charakteristische Polynom. Dann können wir über berechnen und dann ersetzen . Das heißt, wir berechnen als Polynom, unter Verwendung der Tatsache , daß , und nur am Ende Ersatz werden die Werte von . Wir könnten sogar alle notwendigen Potenzen von und alle Werte von fürMP(M)=0PMnR[M]/(P(M))MMnP(M)=0MMMk(modP(M))k<2degP1, und dann könnte dieser Algorithmus schneller sein als der Algorithmus, lautet die Antwort von Massimo Cafaro. Es ist möglicherweise numerisch stabiler als der vorherige Algorithmus.

Yuval Filmus
quelle