//SINGULAR Example 2.6.11 //================== we need here ======================= 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); } //======================================================= ring R=0,(x),(C,dp); matrix M0[5][5]=1, 1,0,0,0, -2,-1,0,0,0, 0, 0,2,1,0, 0, 0,0,2,0, 0, 0,0,0,3; 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; matrix M=lift(N,freemodule(nrows(N)))*M0*N-x*freemodule(5); print(M); N=diagonalForm(M); print(N); factorize(N[1,1]); proc extendedDiagonalForm(matrix M) { int n=nrows(M); int m=ncols(M); intvec v=1..n; intvec w=n+1..n+m; intvec u=1..m; intvec x=m+1..n+m; matrix E=unitmat(n); matrix B=unitmat(m); matrix N=M; //to keep M for the test matrix D,K; while(D!=N) { D=N; K=transpose(interred(transpose(concat(E,D)))); E=submat(K,v,v); N=submat(K,v,w); K=interred(transpose(concat(transpose(B),transpose(N)))); K=simplify(K,1); B=submat(K,u,u); N=submat(K,x,u); } matrix T1[n][n]; matrix T2[m][m]; int s=size(module(D)); T1[1..s,n-s+1..n]=unitmat(s); if(s