algorithm                
            Exposición de matrices
        
        
            
    Buscar..
Exposición de matrices para resolver problemas de ejemplo
 Encuentre f (n): n ésimo número de Fibonacci. El problema es bastante fácil cuando n es relativamente pequeño. Podemos usar la recursión simple, f(n) = f(n-1) + f(n-2) , o podemos usar el enfoque de programación dinámica para evitar el cálculo de la misma función una y otra vez. Pero, ¿qué harás si el problema dice: Dado 0 <n <10⁹, encuentra f (n) mod 999983? La programación dinámica fallará, entonces, ¿cómo abordamos este problema? 
Primero veamos cómo la exponenciación matricial puede ayudar a representar una relación recursiva.
Requisitos previos:
- Dadas dos matrices, saber encontrar su producto. Además, dada la matriz de producto de dos matrices, y una de ellas, sabe cómo encontrar la otra matriz.
 - Dada una matriz de tamaño d X d, saber cómo encontrar su n ésima potencia en O (d 3 log (n)).
 
Patrones:
Al principio necesitamos una relación recursiva y queremos encontrar una matriz M que pueda llevarnos al estado deseado desde un conjunto de estados ya conocidos. Supongamos que, conocemos los k estados de una relación de recurrencia dada y queremos encontrar el estado (k + 1) th . Sea M una matriz k X k , y construimos una matriz A: [k X 1] a partir de los estados conocidos de la relación de recurrencia, ahora queremos obtener una matriz B: [k X 1] que representará el conjunto de estados siguientes, es decir, MXA = B como se muestra a continuación:
       |  f(n)  |     | f(n+1) |
       | f(n-1) |     |  f(n)  |
   M X | f(n-2) |  =  | f(n-1) |
       | ...... |     | ...... |
       | f(n-k) |     |f(n-k+1)|
 Entonces, si podemos diseñar M en consecuencia, ¡nuestro trabajo estará listo! La matriz se utilizará para representar la relación de recurrencia.
 Tipo 1: 
 Comencemos con el más simple, f(n) = f(n-1) + f(n-2) 
 Obtenemos, f(n+1) = f(n) + f(n-1) . 
 Supongamos que sabemos f(n) y f(n-1) ; Queremos averiguar f(n+1) . 
 A partir de la situación mencionada anteriormente, la matriz A y la matriz B se pueden formar como se muestra a continuación: 
 Matrix A          Matrix B
|  f(n)  |        | f(n+1) |
| f(n-1) |        |  f(n)  |
  [Nota: la matriz A siempre se diseñará de tal manera que, todos los estados de los que depende f(n+1) , estarán presentes] 
 Ahora, necesitamos diseñar una matriz M 2X2 tal que satisfaga MXA = B como se indicó anteriormente. 
 El primer elemento de B es f(n+1) que en realidad es f(n) + f(n-1) . Para obtener esto, de la matriz A , necesitamos 1 X f (n) y 1 X f (n-1) . Así que la primera fila de M será [1 1] . 
| 1   1 |  X  |  f(n)  |  =  | f(n+1) |
| ----- |     | f(n-1) |     | ------ |
  [Nota: ----- significa que no estamos preocupados por este valor.] 
 De manera similar, el segundo elemento de B es f(n) que puede obtenerse simplemente tomando 1 X f (n) de A , por lo que la segunda fila de M es [1 0]. 
| ----- |  X  |  f(n)  |  =  | ------ |
| 1   0 |     | f(n-1) |     |  f(n)  |
 Entonces conseguimos nuestra deseada 2 X 2 M de la matriz.
| 1   1 |  X  |  f(n)  |  =  | f(n+1) |
| 1   0 |     | f(n-1) |     |  f(n)  |
 Estas matrices se derivan simplemente utilizando la multiplicación de matrices.
Tipo 2:
 Hagámoslo un poco complejo: encuentre f(n) = a X f(n-1) + b X f(n-2) , donde a y b son constantes. 
 Esto nos dice que f(n+1) = a X f(n) + b X f(n-1) . 
 Hasta este punto, esto debe quedar claro que la dimensión de las matrices será igual al número de dependencias, es decir, en este ejemplo particular, nuevamente 2. Entonces, para A y B , podemos construir dos matrices de tamaño 2 X 1 : 
Matrix A             Matrix B
|  f(n)  |          | f(n+1) |
| f(n-1) |          |  f(n)  |
  Ahora para f(n+1) = a X f(n) + b X f(n-1) , necesitamos [a, b] en la primera fila de la matriz objetivo M. Y para el segundo elemento en B , es decir, f(n) ya tenemos eso en la matriz A , así que simplemente tomamos eso, lo que lleva a la segunda fila de la matriz M a [1 0]. Esta vez tenemos: 
| a   b |  X  |  f(n)  |  =  | f(n+1) |
| 1   0 |     | f(n-1) |     |  f(n)  |
 Bastante simple, ¿eh?
Tipo 3:
 Si ha sobrevivido hasta esta etapa, ha envejecido mucho, ahora enfrentemos una relación un poco compleja: encontrar f(n) = a X f(n-1) + c X f(n-3) ? 
 Ups! Hace unos minutos, todo lo que vimos fueron estados contiguos, pero aquí falta el estado f (n-2) . ¿Ahora? 
 En realidad esto ya no es un problema, podemos convertir la relación de la siguiente manera: f(n) = a X f(n-1) + 0 X f(n-2) + c X f(n-3) , deduciendo f(n+1) = a X f(n) + 0 X f(n-1) + c X f(n-2) . Ahora, vemos que esto es en realidad una forma descrita en el Tipo 2. Así que aquí la matriz objetivo M será 3 X 3 , y los elementos son: 
| a 0 c |     |  f(n)  |     | f(n+1) |
| 1 0 0 |  X  | f(n-1) |  =  |  f(n)  |
| 0 1 0 |     | f(n-2) |     | f(n-1) |
 Estos se calculan de la misma manera que en el tipo 2, si le resulta difícil, pruébelo con lápiz y papel.
Tipo 4:
 La vida se está volviendo compleja, y el Sr. Problema ahora te pide que encuentres f(n) = f(n-1) + f(n-2) + c donde c es cualquier constante. 
 Ahora, este es uno nuevo y todo lo que hemos visto en el pasado, después de la multiplicación, cada estado en A se transforma en su próximo estado en B. 
f(n) = f(n-1) + f(n-2) + c
f(n+1) = f(n) + f(n-1) + c
f(n+2) = f(n+1) + f(n) + c
.................... so on
 Entonces, normalmente no podemos hacerlo a través de la moda anterior, pero ¿qué tal si agregamos c como un estado:
      |  f(n)  |   | f(n+1) |
  M X | f(n-1) | = |  f(n)  |
      |    c   |   |    c   |
 Ahora, no es mucho difícil diseñar M. Así es como se hace, pero no te olvides de verificar:
  | 1 1 1 |     |  f(n)  |     | f(n+1) |
  | 1 0 0 |  X  | f(n-1) |  =  |  f(n)  |
  | 0 0 1 |     |    c   |     |    c   |
 Tipo 5:
 Pongámoslo del todo: encuentre f(n) = a X f(n-1) + c X f(n-3) + d X f(n-4) + e . Vamos a dejarlo como un ejercicio para ti. Primero intenta averiguar los estados y la matriz M. Y comprueba si coincide con tu solución. También encuentra la matriz A y B. 
| a 0 c d 1 |
| 1 0 0 0 0 |
| 0 1 0 0 0 |
| 0 0 1 0 0 |
| 0 0 0 0 1 |
 Tipo 6:
A veces la recurrencia se da así:
f(n) = f(n-1)   -> if n is odd
f(n) = f(n-2)   -> if n is even
 En breve:
f(n) = (n&1) X f(n-1) + (!(n&1)) X f(n-2)
 Aquí, podemos dividir las funciones en la base de pares impares y mantener 2 matrices diferentes para ambas y calcularlas por separado.
Tipo 7:
¿Te sientes un poco demasiado seguro? Bien por usted. A veces es posible que tengamos que mantener más de una recurrencia, cuando estén interesados. Por ejemplo, deje que una recurrencia re; atopm sea:
g(n) = 2g(n-1) + 2g(n-2) + f(n)
  Aquí, la recurrencia g (n) depende de f(n) y esto se puede calcular en la misma matriz pero de dimensiones aumentadas. A partir de estos, primero diseñemos las matrices A y B. 
 Matrix A            Matrix B
|  g(n)  |          | g(n+1) |
| g(n-1) |          |  g(n)  |
| f(n+1) |          | f(n+2) |
|  f(n)  |          | f(n+1) |
  Aquí, g(n+1) = 2g(n-1) + f(n+1) and f(n+2) = 2f(n+1) + 2f(n) . Ahora, utilizando los procesos mencionados anteriormente, podemos encontrar que la matriz objetivo M es: 
| 2 2 1 0 |
| 1 0 0 0 |
| 0 0 2 2 |
| 0 0 1 0 |
 Por lo tanto, estas son las categorías básicas de relaciones de recurrencia que se utilizan para resolver con esta técnica simple.