57 lines
1.4 KiB
Plaintext
57 lines
1.4 KiB
Plaintext
Option Base 1
|
|
Private Function Identity(n As Integer) As Variant
|
|
Dim I() As Variant
|
|
ReDim I(n, n)
|
|
For j = 1 To n
|
|
For k = 1 To n
|
|
I(j, k) = 0
|
|
Next k
|
|
Next j
|
|
For j = 1 To n
|
|
I(j, j) = 1
|
|
Next j
|
|
Identity = I
|
|
End Function
|
|
Function MatrixExponentiation(ByVal x As Variant, ByVal n As Integer) As Variant
|
|
If n < 0 Then
|
|
x = WorksheetFunction.MInverse(x)
|
|
n = -n
|
|
End If
|
|
If n = 0 Then
|
|
MatrixExponentiation = Identity(UBound(x))
|
|
Exit Function
|
|
End If
|
|
Dim y() As Variant
|
|
y = Identity(UBound(x))
|
|
Do While n > 1
|
|
If n Mod 2 = 0 Then
|
|
x = WorksheetFunction.MMult(x, x)
|
|
n = n / 2
|
|
Else
|
|
y = WorksheetFunction.MMult(x, y)
|
|
x = WorksheetFunction.MMult(x, x)
|
|
n = (n - 1) / 2
|
|
End If
|
|
Loop
|
|
MatrixExponentiation = WorksheetFunction.MMult(x, y)
|
|
End Function
|
|
Public Sub pp(x As Variant)
|
|
For i_ = 1 To UBound(x)
|
|
For j_ = 1 To UBound(x)
|
|
Debug.Print x(i_, j_),
|
|
Next j_
|
|
Debug.Print
|
|
Next i_
|
|
End Sub
|
|
Public Sub main()
|
|
M2 = [{3,2;2,1}]
|
|
M3 = [{1,2,0;0,3,1;1,0,0}]
|
|
pp MatrixExponentiation(M2, -1)
|
|
Debug.Print
|
|
pp MatrixExponentiation(M2, 0)
|
|
Debug.Print
|
|
pp MatrixExponentiation(M2, 10)
|
|
Debug.Print
|
|
pp MatrixExponentiation(M3, 10)
|
|
End Sub
|