Nota importante : poiché questa sfida si applica solo alle matrici quadrate, ogni volta che utilizzo il termine "matrice", si presume che mi riferisca a una matrice quadrata. Lascio la descrizione "quadrata" per brevità.
sfondo
Molte operazioni legate alla matrice, come calcolare il determinante, risolvere un sistema lineare o estendere le funzioni con valori scalari alle matrici, sono rese più semplici usando una matrice diagonale (una i cui elementi che non sono sulla diagonale principale sono 0) che è simile alla matrice originale (che significa, per la matrice di input Ae la matrice diagonale D, esiste una matrice invertibile Ptale che D = P^(-1) * A * P; inoltre, De Acondividono alcune proprietà importanti, come autovalori, determinante e traccia). Per matrici con autovalori distinti (radici alle polinomio caratteristico della matrice, in soluzione det(A-λI) = 0per λ, dove Iè la matrice identità con le stesse dimensioni A), diagonalizzazione è semplice:Dè una matrice con gli autovalori sulla diagonale principale ed Pè una matrice formata da autovettori corrispondenti a tali autovalori (nello stesso ordine). Questo processo si chiama eigendecomposition .
Tuttavia, le matrici con autovalori ripetuti non possono essere diagonali in questo modo. Fortunatamente, la normale forma Jordan di qualsiasi matrice può essere calcolata piuttosto facilmente, e non è molto più difficile da lavorare rispetto a una normale matrice diagonale. Ha anche la bella proprietà che, se gli autovalori sono unici, la decomposizione della Giordania è identica alla composizione geografica.
Spiegazione della decomposizione della Giordania
Per una matrice quadrata i Acui autovalori hanno tutti una molteplicità geometrica di 1, il processo di decomposizione della Giordania può essere descritto come tale:
- Sia
λ = {λ_1, λ_2, ... λ_n}l'elenco di autovalori diA, con molteplicità, con autovalori ripetuti che compaiono consecutivamente. - Crea una matrice diagonale i
Jcui elementi sono gli elementi diλ, nello stesso ordine. - Per ogni autovalore con molteplicità maggiore di 1, posizionare
1a alla destra di ciascuna delle ripetizioni dell'autovalore nella diagonale principale diJ, tranne l'ultima.
La matrice risultante Jè una forma normale della Giordania di A(possono esistere più forme normali della Giordania per una data matrice, a seconda dell'ordine degli autovalori).
Un esempio funzionante
Sia Ala seguente matrice:
Gli autovalori di A, con molteplicità, sono λ = {1, 2, 4, 4}. Inserendo questi in una matrice diagonale, otteniamo questo risultato:
Successivamente, posizioniamo 1s alla destra di tutti tranne uno di ciascuno degli autovalori ripetuti. Poiché 4è l'unico autovalore ripetuto, posizioniamo un singolo 1accanto al primo 4:
Questa è una forma normale della Giordania di A(una singola matrice può potenzialmente avere diverse forme normali della Giordania valide, ma sto esaminando quel dettaglio a scopo di spiegazione).
L'obiettivo
Data una matrice quadrata Acome input, genera una forma normale valida di Jordan A.
- L'input e l'output possono essere in qualsiasi formato ragionevole (array / list 2D / qualunque cosa, list / array / qualunque dei vettori di colonna o riga, un tipo di dati a matrice incorporato, ecc.).
- Gli elementi e gli autovalori di
Asaranno sempre numeri interi nell'intervallo[-200, 200]. - Per semplicità, tutti gli autovalori avranno una molteplicità geometrica di 1 (e quindi vale il processo sopra).
Asarà al massimo una matrice 10x10 e almeno una matrice 2x2.- Non sono consentiti builtin che calcolano autovalori e / o autovettori o eseguono la composizione elettronica, la decomposizione della Giordania o qualsiasi altro tipo di decomposizione / diagonalizzazione. Sono ammessi l'aritmetica della matrice, l'inversione della matrice e altri built-in della matrice.
Casi test
[[1, 0], [0, 1]] -> [[1, 1], [0, 1]]
[[3, 0], [0, 3]] -> [[1, 1], [0, 1]]
[[4, 2, 2], [1, 2, 2],[0, 3, 3]] -> [[6, 0, 0], [0, 3, 0], [0, 0, 0]]
[[42, 48, 40, 64, 64], [41, 47, 31, 58, 42], [-55, -47, -27, -74, -46], [-46, -58, -46, -70, -68], [30, 20, 12, 34, 18]] -> [[10, 0, 0, 0, 0], [0, -18, 0, 0, 0], [0, 0, 6, 1, 0], [0, 0, 0, 6, 1], [0, 0, 0, 0, 6]]




Last@JordanDecomposition@#&? O è barare?