Esiste un metodo più veloce di esponenziazione matriciale per calcolare M^n (dove M è una matrice en è un intero) rispetto al semplice algoritmo di divisione e conquista.Fast Exponentiation Matrix
risposta
È possibile calcolare la matrice in autovalori e autovettori. Quindi ottieni
M = V^-1 * D * V
Dove V è la matrice autovettore e D è una matrice diagonale. Per sollevare questo all'ennesima potenza, si ottiene qualcosa di simile:
M^n = (V^-1 * D * V) * (V^-1 * D * V) * ... * (V^-1 * D * V)
= V^-1 * D^n * V
Perché tutto il V e^-1 termini V si annullano.
Dato che D è diagonale, è sufficiente generare un numero di numeri (reali) all'ennesima potenza, anziché a matrici complete. Puoi farlo in tempo logaritmico in n.
Calcolo di autovalori e autovettori è r^3 (dove r è il numero di righe/colonne di M). A seconda delle dimensioni relative di r e n, questo potrebbe essere più veloce o meno.
Per quanto ne so, questo metodo ha la stessa complessità di Esponentiation di Squaring. Quindi c'è un metodo più veloce? –
@AkashdeepSaluja: questo è più veloce dell'esponenziazione mediante quadratura. Questo è il tempo O (r^3), l'esponenziazione per squadratura è O (r^3 logn). –
per una spiegazione migliore del metodo sopra menzionato http://www.google.co.in/url?sa=t&rct=j&q=pdf%20nth%20power%20of%20matrix&source=web&cd=1&cad=rja&ved=0CCAQFjAA&url=http% 3A% 2F% 2Fwww.qc.edu.hk% 2Fmath% 2FTeaching_Learning% 2FNth% 2520power% 2520of% 2520a% 2520square% 2520matrix.pdf & ei = Jf9JULrwFsi8rAejh4C4DQ & usg = AFQjCNE7yqQce5jdtyyVLFpSZmYUnoWyVA –
Exponentiation by squaring viene spesso utilizzato per ottenere alte potenze di matrici.
Vorrei raccomandare l'approccio utilizzato per calcolare la sequenza di Fibbonacci in matrix form. AFAIK, la sua efficienza è O (log (n)).
Devi moltiplicarlo per il costo della moltiplicazione delle matrici.Il tempo di esecuzione complessivo è O (n^3 log n). – saadtaame
È molto semplice utilizzare l'algoritmo di Euler a potenza elevata. Usa l'algoritmo successivo.
#define SIZE 10
//It's simple E matrix
// 1 0 ... 0
// 0 1 ... 0
// ....
// 0 0 ... 1
void one(long a[SIZE][SIZE])
{
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
a[i][j] = (i == j);
}
//Multiply matrix a to matrix b and print result into a
void mul(long a[SIZE][SIZE], long b[SIZE][SIZE])
{
long res[SIZE][SIZE] = {{0}};
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
for (int k = 0; k < SIZE; k++)
{
res[i][j] += a[i][k] * b[k][j];
}
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
a[i][j] = res[i][j];
}
//Caluclate a^n and print result into matrix res
void pow(long a[SIZE][SIZE], long n, long res[SIZE][SIZE])
{
one(res);
while (n > 0) {
if (n % 2 == 0)
{
mul(a, a);
n /= 2;
}
else {
mul(res, a);
n--;
}
}
}
Qui di seguito potete trovare equivalente per i numeri:
long power(long num, long pow)
{
if (pow == 0) return 1;
if (pow % 2 == 0)
return power(num*num, pow/2);
else
return power(num, pow - 1) * num;
}
- 1. java matrix-moltiplicazione (FAST)
- 2. CSR Matrix - Matrix moltiplicazione
- 3. Fast Random Generator
- 4. Fail Fast vs. Solidità
- 5. Fast Delega C++
- 6. Ricorsione Fast Fibonacci
- 7. Raccomandazione per C# Matrix Library
- 8. Exponentiation in Ruby 1.8.7 Restituisce le risposte errate
- 9. Fast Median Filter in C++
- 10. Fast Levenshtein distanza in R?
- 11. Fast Division su GCC/ARM
- 12. Java/Android - Fast ByteBuffer Parsing
- 13. HTML5 Canvas Transformation Matrix
- 14. Dimensioni di Matrix OpenCV
- 15. slicing sparse (scipy) matrix
- 16. matlab matrix notazione scientifica
- 17. Numpy matrix to array
- 18. Matrix come dizionario chiave
- 19. Matrix moltiplicazione in OpenCV
- 20. Matrix power in R
- 21. Matrix Libreria standard
- 22. C++ Matrix Class
- 23. Python Lambda Identity Matrix
- 24. Libreria Go Matrix
- 25. nrow (matrix) function
- 26. Keras, emissione sparse matrix
- 27. Matlab 3D Matrix Plot
- 28. Scikit-learn confusion matrix
- 29. implementazione di un processo intermedio Fast .NET Fast-Free con SharedMemory MMF
- 30. Fast String all'interno di Ricerca elenco
Hey ho trovato un anello di StackOverflow solo controllare fuori http://stackoverflow.com/questions/12268516/matrix-exponentiation -using-fermats-theorem –
Expokit è un pacchetto ben noto per l'esecuzione di esponenziamenti di matrice. http://fortranwiki.org/fortran/show/Expokit – Sayan