---soluzione esercizi asswgnati 26 Maggio 2020
---Esercizio 1
---abbiamo quattro punti, ciascuno con molteplicità 2

K[x]/(x+2)^2  

R=QQ[x]
f=((x+2)*(x+1)*(x-1)*(x-2))^2
g2=sub(f/(x-2)^2,R)
g1=sub(f/(x-1)^2,R)
gm1=sub(f/(x+1)^2,R)
gm2=sub(f/(x+2)^2,R)
bb=(quotientRemainder(matrix{{1_R}},matrix{{gm2,gm1,g1,g2}}))_0
---a=(matrix{{gm2*(1+(x+2)),gm1*(-1-(x+1)),g1*(1+(x-1)),g2*(-1-(x-2))}}*bb)_(0,0)
a=(matrix{{gm2*(1+(x+2)),gm1*(-1-(x+1)),g1*(1-(x-1)),g2*(-1+(x-2))}}*bb)_(0,0)
aa=a%ideal(f)
sub(aa,x=>-2)
sub(diff(x,aa),x=>-2)
toString(aa)

---esercizio 2
restart
R=QQ[x]
a=mutableMatrix(R,10,10)
for i from 0 to 9 do for j from 0 to 9 do a_(i,j)=1/((i+1)^2+j+1)
a=matrix a
eigenvalues sub(a,CC)
rank a
det(a)
discriminant(det(a-x*a^0),x)----e' non nullo
---in aritmetica esatta i dieci autovalori di a sono distinti !!
---quindi A è diagonalizzabile su C
---il polinomio minimo coincide col polinomio caratteristico
f=det(a-x*a^0)
I=ideal(f)
bb=sub(basis (R/I),R)
d=numcols bb
--prima colonna della matrice compagna
comp=sub(contract(transpose bb,(bb_(0,0))*x%I),x=>0_QQ)
--aggiungo le colonne
for i from 1 to (d-1) do comp=comp|sub(contract(transpose bb,(bb_(0,i))*x%I),x=>0_QQ)
comp

---calcolo degli autovalori approssimati
sol=eigenvalues comp

---costruzione della matrice bezoutiante (matrice della forma traccia)
b=mutableMatrix(R,d,d)
for i from 0 to d-1 do for j from 0 to d-1 do b_(i,j)=trace(comp^(i+j))
bez=matrix b
bez_(0,1)


for i from 1 to 9 do print(i,det submatrix(bez,{0..i},{0..i}))
------sono tutti positivi, quindi la bezoutiante è definita positiva,
---gli autovalori sono tutti reali, quindi A è diagonalizzabile sui reali

b=mutableMatrix(R,d,d)
for i from 0 to d-1 do for j from 0 to d-1 do b_(i,j)=trace(comp^(i+j+1))
bez=matrix b;
----se questa bez è definita positiva, allora le radici sono tutte reali positive
---quindi le radici reali sono positive
----come posso contare in aritmetica esatta le radici comprese 
----nell'intervallo (0,1/10)---mi aspetto 8 radici in questo intervallo
----considero il polinomio h(x)=10x-1
b=mutableMatrix(R,d,d)
for i from 0 to d-1 do for j from 0 to d-1 do b_(i,j)=trace(comp^(i+j)*(-10*comp+comp^0))
bez=matrix b;
bez_(0,0)----è positivo----
eigenvalues sub(bez,CC)
g=det(bez-x*bez^0);---ci sono esattamente 8 variazioni, quindi la segnatura è (8,2)
for i from 0 to 10 do if sub(diff(x^i,g),x=>0)>0 then print(i,+1) else print(i,-1)
---pertanto ci sono 8 radici reali nell'intervallo (0,1/10)

---esercizio 3
restart
R=QQ[a_(0,0)..a_(4,4),x]
aa=transpose genericMatrix(R,a_(0,0),5,5)
m=matrix{{-5/2,1/2,0,0,0},{-1/2,-3/2,0,0,0},{0,0,-2_R,1,0},{0,0,0,-2,0},{0,0,0,0,3}}
discriminant(det(m-x*m^0),x)
---voglio trasformare la matrice 5x5 in un vettore con 25 componenti
aux=diff(matrix{{a_(0,0)..a_(4,4)}},trace(aa*m^0))
for i from 1 to 5 do (aux=aux||diff(matrix{{a_(0,0)..a_(4,4)}},trace(aa*m^i)),print(i,rank aux))
---il polinomio minimo ha grado 3, e divide il polinomio caratteristico
----m^0, m^1, m^2, m^3 sono dipendenti, la dipendenza lineare mi dà il polinomio
---minimo
aux=diff(matrix{{a_(0,0)..a_(4,4)}},trace(aa*m^0))
for i from 1 to 3 do (aux=aux||diff(matrix{{a_(0,0)..a_(4,4)}},trace(aa*m^i)),print(i,rank aux))
aux
minpoly=(matrix{{1,x,x^2,x^3}}*gens kernel transpose aux)_(0,0)---polinomio minimo
discriminant(minpoly,x)---viene zero !!
---quindi il polinomio ha radici ripetute, la matrice non è diagonalizzabile,
---neanche su C
factor minpoly
factor det(m-x*m^0)
----autovalore -2 ha molt algebrica 4---
aux
----se le 6 righe sono indipendenti allora il polinomio minimo coincide col polinomio caratteristico
----sicuramente la matrice non è diagonalizzabile
rank(aux)