/***************************************** * Computer Algebra System SINGULAR * *****************************************/ /* $Id$ */ /* * ABSTRACT: eigenvalues of constant square matrices */ #include #ifdef HAVE_EIGENVAL #include #include //#include "ipid.h" #include #include #include #include //#include "lists.h" #include #include #include matrix evSwap(matrix M,int i,int j) { if(i==j) return(M); for(int k=1;k<=MATROWS(M);k++) { poly p=MATELEM(M,i,k); MATELEM(M,i,k)=MATELEM(M,j,k); MATELEM(M,j,k)=p; } for(int k=1;k<=MATCOLS(M);k++) { poly p=MATELEM(M,k,i); MATELEM(M,k,i)=MATELEM(M,k,j); MATELEM(M,k,j)=p; } return(M); } matrix evRowElim(matrix M,int i,int j,int k) { if(MATELEM(M,i,k)==NULL||MATELEM(M,j,k)==NULL) return(M); poly p=pNSet(nDiv(pGetCoeff(MATELEM(M,i,k)),pGetCoeff(MATELEM(M,j,k)))); pNormalize(p); for(int l=1;l<=MATCOLS(M);l++) { MATELEM(M,i,l)=pSub(MATELEM(M,i,l),ppMult_qq(p,MATELEM(M,j,l))); pNormalize(MATELEM(M,i,l)); } for(int l=1;l<=MATROWS(M);l++) { MATELEM(M,l,j)=pAdd(MATELEM(M,l,j),ppMult_qq(p,MATELEM(M,l,i))); pNormalize(MATELEM(M,l,j)); } pDelete(&p); return(M); } matrix evColElim(matrix M,int i,int j,int k) { if(MATELEM(M,k,i)==0||MATELEM(M,k,j)==0) return(M); poly p=pNSet(nDiv(pGetCoeff(MATELEM(M,k,i)),pGetCoeff(MATELEM(M,k,j)))); pNormalize(p); for(int l=1;l<=MATROWS(M);l++) { MATELEM(M,l,i)=pSub(MATELEM(M,l,i),ppMult_qq(p,MATELEM(M,l,j))); pNormalize(MATELEM(M,l,i)); } for(int l=1;l<=MATCOLS(M);l++) { MATELEM(M,j,l)=pAdd(MATELEM(M,j,l),ppMult_qq(p,MATELEM(M,i,l))); pNormalize(MATELEM(M,j,l)); } pDelete(&p); return(M); } matrix evHessenberg(matrix M) { int n=MATROWS(M); if(n!=MATCOLS(M)) return(M); for(int k=1,j=2;k