Ricerca…


Esponenziazione della matrice per risolvere problemi di esempio

Trova f (n): n-esimo numero di Fibonacci. Il problema è abbastanza semplice quando n è relativamente piccolo. Possiamo usare la ricorsione semplice, f(n) = f(n-1) + f(n-2) , oppure possiamo usare un approccio di programmazione dinamica per evitare il calcolo della stessa funzione più e più volte. Ma cosa farai se il problema dice, Dato 0 <n <10⁹, trova f (n) mod 999983? La programmazione dinamica fallirà, quindi come affrontiamo questo problema?

Per prima cosa vediamo come l'esponenziazione della matrice può aiutare a rappresentare la relazione ricorsiva.

Prerequisiti:

  • Date due matrici, sai come trovare il loro prodotto. Inoltre, data la matrice di prodotto di due matrici, e una di esse, sai come trovare l'altra matrice.
  • Data una matrice di dimensione d X d, sapere come trovare il suo n esima potenza a O (D 3 log (n)).

Patterns:

All'inizio abbiamo bisogno di una relazione ricorsiva e vogliamo trovare una matrice M che possa portarci allo stato desiderato da un insieme di stati già noti. Supponiamo che, conosciamo gli stati k di una data relazione di ricorrenza e vogliamo trovare lo stato (k + 1) th . Sia M una matrice k X k , e costruiamo una matrice A: [k X 1] dagli stati noti della relazione di ricorrenza, ora vogliamo ottenere una matrice B: [k X 1] che rappresenterà l'insieme di prossimi stati, cioè MXA = B come mostrato di seguito:

       |  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)|

Quindi, se possiamo progettare M di conseguenza, il nostro lavoro sarà fatto! La matrice verrà quindi utilizzata per rappresentare la relazione di ricorrenza.

Tipo 1:
Iniziamo con il più semplice, f(n) = f(n-1) + f(n-2)
Otteniamo, f(n+1) = f(n) + f(n-1) .
Supponiamo che conosciamo f(n) ed f(n-1) ; Vogliamo scoprire f(n+1) .
Dalla situazione sopra riportata, la matrice A e la matrice B possono essere formate come mostrato di seguito:

 Matrix A          Matrix B

|  f(n)  |        | f(n+1) |
| f(n-1) |        |  f(n)  |

[Nota: la matrice A sarà sempre progettata in modo tale che, ogni stato su cui f(n+1) dipende, sarà presente]
Ora, abbiamo bisogno di progettare una matrice M 2X tale che soddisfi MXA = B come detto sopra.
Il primo elemento di B è f(n+1) che è in realtà f(n) + f(n-1) . Per ottenere questo, dalla matrice A , abbiamo bisogno, 1 X f (n) e 1 X f (n-1) . Quindi la prima riga di M sarà [1 1] .

| 1   1 |  X  |  f(n)  |  =  | f(n+1) |
| ----- |     | f(n-1) |     | ------ |

[Nota: ----- significa che non siamo preoccupati per questo valore.]
Allo stesso modo, il secondo elemento di B è f(n) che può essere ottenuto semplicemente prendendo 1 X f (n) da A , quindi la 2a riga di M è [1 0].

| ----- |  X  |  f(n)  |  =  | ------ |
| 1   0 |     | f(n-1) |     |  f(n)  |

Allora otteniamo la nostra desiderata 2 X 2 matrice M.

| 1   1 |  X  |  f(n)  |  =  | f(n+1) |
| 1   0 |     | f(n-1) |     |  f(n)  |

Queste matrici sono semplicemente derivate usando la moltiplicazione della matrice.

Tipo 2:

Facciamolo un po 'complesso: trova f(n) = a X f(n-1) + b X f(n-2) , dove a e b sono costanti.
Questo ci dice, f(n+1) = a X f(n) + b X f(n-1) .
A questo punto, dovrebbe essere chiaro che la dimensione delle matrici sarà uguale al numero di dipendenze, cioè in questo particolare esempio, ancora 2. Quindi per A e B , possiamo costruire due matrici di dimensione 2 X 1 :

Matrix A             Matrix B
|  f(n)  |          | f(n+1) |
| f(n-1) |          |  f(n)  |

Ora per f(n+1) = a X f(n) + b X f(n-1) , abbiamo bisogno di [a, b] nella prima riga della matrice obiettiva M. E per il secondo elemento in B , cioè f(n) abbiamo già nella matrice A , quindi prendiamo semplicemente quello che conduce, la 2a riga della matrice M a [1 0]. Questa volta otteniamo:

| a   b |  X  |  f(n)  |  =  | f(n+1) |
| 1   0 |     | f(n-1) |     |  f(n)  |

Piuttosto semplice, eh?

Tipo 3:

Se sei sopravvissuto fino a questo stadio, sei cresciuto molto più vecchio, ora affrontiamo una relazione un po 'complessa: trova f(n) = a X f(n-1) + c X f(n-3) ?
Ops! Pochi minuti fa, tutto ciò che abbiamo visto erano stati contigui, ma qui manca lo stato f (n-2) . Adesso?

In realtà questo non è più un problema, possiamo convertire la relazione come segue: f(n) = a X f(n-1) + 0 X f(n-2) + c X f(n-3) , deducendo f(n+1) = a X f(n) + 0 X f(n-1) + c X f(n-2) . Ora, vediamo che questa è in realtà una forma descritta nel Tipo 2. Quindi qui la matrice obiettivo M sarà 3 X 3 , e gli elementi sono:

| 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) |

Questi sono calcolati allo stesso modo del tipo 2, se lo trovi difficile, provalo su carta e penna.

Tipo 4:

La vita diventa complessa come l'inferno, e Mr, Problema ora ti chiede di trovare f(n) = f(n-1) + f(n-2) + c dove c è una qualsiasi costante.
Ora questo è nuovo e tutto ciò che abbiamo visto in passato, dopo la moltiplicazione, ogni stato in A si trasforma nel suo stato successivo in 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

Quindi, normalmente non possiamo ottenere attraverso la moda precedente, ma che ne dici di aggiungere c come stato:

      |  f(n)  |   | f(n+1) |
  M X | f(n-1) | = |  f(n)  |
      |    c   |   |    c   |

Ora, non è molto difficile da progettare M. Ecco come è fatto, ma non dimenticare di verificare:

  | 1 1 1 |     |  f(n)  |     | f(n+1) |
  | 1 0 0 |  X  | f(n-1) |  =  |  f(n)  |
  | 0 0 1 |     |    c   |     |    c   |

Tipo 5:

Mettiamola del tutto: trova f(n) = a X f(n-1) + c X f(n-3) + d X f(n-4) + e . Lascia che sia un esercizio per te. Prima prova a scoprire gli stati e la matrice M. E controlla se corrisponde alla tua soluzione. Trova anche la matrice A e 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 volte la ricorrenza viene data in questo modo:

f(n) = f(n-1)   -> if n is odd
f(n) = f(n-2)   -> if n is even

In breve:

f(n) = (n&1) X f(n-1) + (!(n&1)) X f(n-2)

Qui, possiamo dividere le funzioni in base a pari dispari e mantenere 2 matrici diverse per entrambe e calcolarle separatamente.

Tipo 7:

Ti senti poco sicuro di te? Buon per te. A volte potremmo aver bisogno di mantenere più di una ricorrenza, dove sono interessati. Ad esempio, lascia che una ricorrenza sia; atopm essere:

g(n) = 2g(n-1) + 2g(n-2) + f(n)

Qui, la recidiva g (n) dipende da f(n) e questo può essere calcolato nella stessa matrice ma di dimensioni maggiori. Da questi iniziamo a disegnare le matrici A e 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) |

Qui, g(n+1) = 2g(n-1) + f(n+1) and f(n+2) = 2f(n+1) + 2f(n) . Ora, usando i processi sopra indicati, possiamo trovare la matrice obiettiva M come:

| 2 2 1 0 |
| 1 0 0 0 |
| 0 0 2 2 |
| 0 0 1 0 |

Quindi, queste sono le categorie di base delle relazioni di ricorrenza che vengono utilizzate per risolvere questa semplice tecnica.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow