E' tale se il coefficente numerico del monomio di grado massimo è 1.
Il polinomio minimo di \(A\) (matrice quadrata) è il polinomio monico di grado minimo che ammette \(A\) come radice, ossia tale che
\(m_A(A) = O_n\)
(dove \(O_n\) è la matrice nulla di ordine \(n\)). Sappiamo che ogni matrice quadrata \(A\) di ordine \(n\) è radice del suo polinomio caratteristico: \(p_A(A) = det(A - \lambda Id_n)\). Il polinomio minimo di \(A\) è uno dei possibili divisori del polinomio caratteristico. Ad esempio se il polinomio caratteristico (vedi sezione "15" per come calcolarlo) è \((\lambda -1)^3(\lambda-2)\) i divisori che si annullano su tutti gli autovalori di \(A\) sono: \((\lambda-1)(\lambda-2), (\lambda-1)^2(\lambda-2)\) e \((\lambda-1)^3(\lambda-2)\)
def polinomioMinimo(A):
l = sp.symbols('l')
dimensione = A.shape[0]
polinomio_caratteristico = A.charpoly(l)
grado = polinomio_caratteristico.degree()
fattori = sp.factor_list(polinomio_caratteristico)[1]
for i in range(1, grado):
sub_espressione = 1
for fattore in fattori:
esponente = fattore[1]
polinomio_puro = fattore[0]
_id = polinomio_puro.coeff_monomial(1) * sp.eye(dimensione)
sub_espressione *= (A + _id)**(min(esponente, i))
if sub_espressione == sp.zeros(dimensione):
polinomio_minimo = 1
for fattore in fattori:
termine_noto = fattore[0].coeff_monomial(1)
polinomio_minimo *= (l + termine_noto)**(min(fattore[1], i))
return polinomio_minimo
A = sp.Matrix([[1,1,1,1], [0,1,0,1], [0,0,1,0], [0,0,0,2]])
res= polinomioMinimo(A)
print(res)
(l - 2)*(l - 1)**2
Come da esercizio
A = sp.Matrix([[2,0,0,0,0], [5,2,0,0,0], [0,0,4,3,0], [0,0,2,5,0], [0,0,0,0,4]])
res= polinomioMinimo(A)
print(res)
(l - 7)*(l - 4)*(l - 2)**2
L'esercizio non fornisce la soluzione da verificare (https://www.youmath.it/esercizi/es-algebra-lineare/esercizi-matrici-vettori/4254-esercizi-risolti-polinomio-minimo.html).