//SINGULAR Example 2.6.3
proc diagonalForm(matrix M)
{
int n=nrows(M);
int m=ncols(M);
matrix N,K;
matrix L[n][m];
while(N!=M)
{
N=M;
M=L;
K=transpose(interred(transpose(interred(N))));
M[1..nrows(K),1..ncols(K)]=K;
}
return(N);
}
option(redSB);
ring R=0,(x),(C,dp);
matrix M[2][3]=(x2+1)^2,0, 0,
0, x3-x-1,0;
matrix N1[2][2]=1, 1,
2,-2;
matrix N2[3][3]=1,2, 3,
4,5, 6,
7,8,-1;
M=N1*M*N2;
print(M);
diagonalForm(M);
matrix M0[5][5]=1, 1,0, 0,0,
3,-1,0, 0,0,
0, 0,1, 1,0,
0, 0,3,-1,0,
0, 0,0, 0,2;
matrix N[5][5]=1, 1, -1, 1,-1,
2, 2, 1, 1, 0,
-1, 2, 2, 1, 1,
-2, 1, 1, -1, 0,
1, 2, -2, 1, 1;
M=lift(N,freemodule(nrows(N)))*M0*N-x*freemodule(5);
print(M);
print(diagonalForm(M));