¿Existe algún método más rápido de exponenciación de matrices para calcular M^n (donde M es una matriz yn es un número entero) que el algoritmo de división y conquista simple?Exponencialización de matriz rápida
Respuesta
Puede factorizar la matriz en autovalores y autovectores. Entonces obtienes
M = V^-1 * D * V
Donde V es la matriz de vectores propios y D es una matriz diagonal. Para elevar esto a la enésima potencia, se obtiene algo así como:
M^n = (V^-1 * D * V) * (V^-1 * D * V) * ... * (V^-1 * D * V)
= V^-1 * D^n * V
porque todos los V y V^-1 términos se anulan.
Dado que D es diagonal, solo tiene que elevar un grupo de números (reales) a la enésima potencia, en lugar de matrices completas. Puedes hacer eso en tiempo logarítmico en n.
El cálculo de autovalores y autovectores es r^3 (donde r es el número de filas/columnas de M). Dependiendo de los tamaños relativos de ryn, esto podría ser más rápido o no.
Hasta donde yo sé, este método tiene la misma complejidad que la exponenciación por cuadratura. Entonces, ¿hay algún método más rápido? –
@AkashdeepSaluja: esto es más rápido que la exponenciación por cuadratura. Este es el tiempo O (r^3), la exponenciación por cuadratura es el tiempo O (r^3 logn). –
para una mejor explicación del método mencionado anteriormente 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 se usa con frecuencia para obtener altas potencias de matrices.
Recomendaría el enfoque utilizado para calcular la secuencia de Fibbonacci en matrix form. AFAIK, su eficiencia es O (log (n)).
Tienes que multiplicar eso por el costo de multiplicar matrices.El tiempo total de ejecución es O (n^3 log n). – saadtaame
Es bastante simple utilizar el algoritmo de potencia rápida de Euler. Usa el siguiente algoritmo
#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--;
}
}
}
A continuación encontrará equivalentes para los números:
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. matriz java lista rápida
- 2. Exponencialización modular para números altos en C++
- 3. Matlab matriz de struct: Asignación rápida
- 4. ¿Implementación de cambio de matriz rápida en C#?
- 5. sustitución rápida de los valores en una matriz numpy
- 6. manera más rápida de rellenar una matriz numérica 1D
- 7. multiplicación rápida de los valores en una matriz
- 8. PHP: aplana la matriz de la manera más rápida?
- 9. Biblioteca de matriz de Java rápida adecuada para JOGL + matriz matemática genérica?
- 10. ¿Una forma extremadamente rápida de clonar los valores de una matriz dentada en una segunda matriz?
- 11. ¿La forma más rápida de convertir una matriz de cadenas en una matriz doble?
- 12. multiplicación de enteros rápida/rápida en ruby?
- 13. serialización rápida/deserialización de estructuras
- 14. matriz java para ordenar: forma rápida de obtener una lista ordenada de los índices de una matriz
- 15. ¿La llamada rápida es realmente más rápida?
- 16. suma de prefijo paralelo - implementación más rápida
- 17. cuestión de Java rápida: Fundición una serie de objetos en una matriz de mi clase pretendido
- 18. la conversión de una lista de cadenas en una matriz numpy de una manera más rápida
- 19. manera rápida de comprobar si una matriz de caracteres es cero
- 20. La forma más rápida de encontrar una Cadena en una matriz de cadena
- 21. La forma más rápida de comprobar si un vector aumenta el rango de matriz
- 22. Excel VBA ¿La forma más rápida de ordenar una matriz de números en orden descendente?
- 23. ¿Existe alguna manera rápida de eliminar un valor específico de una matriz en Javascript?
- 24. ¿La forma más rápida de poner a cero una matriz de 2d en C?
- 25. ¿Cómo hacer este tipo de matriz de igualdad rápida (en numpy)?
- 26. ¿Cuál es la forma más rápida de ordenar una matriz de 7 enteros?
- 27. ¿Cuál es la forma más rápida de convertir una matriz de flotadores en una cadena?
- 28. La forma más rápida de leer una columna de números en una matriz
- 29. Forma más rápida (rendimiento) de convertir una cadena en una matriz de bytes [] en C#
- 30. ¿La forma más rápida de copiar el contenido de un vector en una matriz?
Hey me encontré con un eslabón de stackoverflow única comprobarlo http://stackoverflow.com/questions/12268516/matrix-exponentiation -using-fermats-theorem –
Expokit es un paquete muy conocido para realizar exponenciales de matrices. http://fortranwiki.org/fortran/show/Expokit – Sayan