---- matrici compagne in due variabili.
restart
R=QQ[x,y]
I=ideal(x^3-5*y^3+3*x*y+14*x-101*y^2-2,x^3+2*y^3-5)
---I=ideal(x^2+y^2-2,x*y-1)
bb=sub(basis(R/I),R)
d=numcols(bb)
----prima colonna della matrice compagna rispetto a x
compx=sub(contract(transpose bb,(bb_(0,0))*x%I),{x=>0_QQ,y=>0})
---vengono calcolate le colonne successive di compx
for i from 1 to (d-1) do
compx=compx|sub(contract(transpose bb,(bb_(0,i))*x%I),{x=>0_QQ,y=>0})
compx
---come trovo le ascisse delle soluzioni ?
solx=eigenvalues(compx)
----prima colonna della matrice compagna rispetto a y
compy=sub(contract(transpose bb,(bb_(0,0))*y%I),{x=>0_QQ,y=>0})
for i from 1 to (d-1) do
compy=compy|sub(contract(transpose bb,(bb_(0,i))*y%I),{x=>0_QQ,y=>0})
compy
soly=eigenvalues(compy)
solx, soly
eigenvectors(compx),eigenvectors(compy)
rank(compx-compx^0)---3
rank(compx-compx^0)^2----2, ranghi diversi quindi la matrice compx non e' diagonalizzabile
primaryDecomposition I
----possiamo verificare che 
---l'autovalore zero di M_x e' in coppia con l'autovalore 0 di M_y
---l'autovalore tre di M_x e' in coppia con l'autovalore otto di M_y
---l'autovalore quattro di M_x e' in coppia con l'autovalore tre di M_y
---------------------------------------------------
----utilizziamo invece gli autovettori della trasposta di M_x
eig=(eigenvectors(transpose (compx)))_1
for i from 0 to 8 do print(eig_(1,i)/eig_(0,i),eig_(7,i)/eig_(0,i))


-----------forma traccia in piu' variabili
----il comando seguente e' importante
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(compx^((matrix exponents(bb_(0,i)*bb_(0,j)))_(0,0))*compy^((matrix exponents(bb_(0,i)*bb_(0,j)))_(0,1)))
b=matrix b
eigenvalues(sub(b,CC))
factor(x^2-y^2)