program matrixcommute c Finds the basis of the space of matrices that commute with a c given matrix c *************************************************************** c n: Order of the matrix c A(i,j): Input matrix (a(i,j) in the program) c program finds complete basis for the space of matrices that c commute with $A$. c Redirect output to file: c Example matrixcommute.e >> matrixcommute.out c *************************************************************** integer i,j,k,m,n,index(100,2) real*8 pi,a(100,100),stiff(100,100),ident(100,100),w(100), & v(100,100),matrixcommute(100,100),error pi=4.0d0*datan(1.0d0) open(unit=5,file='matrixcommute.dat',status='old') read(5,*) n do 10 i=1,n read(5,*) (a(i,j),j=1,n) 10 continue m=0 ident(1:n,1:n)=0.0d0 do 20 i=1,n ident(i,i)=1.0d0 20 continue k=0 do 260 j=1,n do 240 i=1,n k=k+1 index(k,1)=i index(k,2)=j 240 continue 260 continue do 1000 i=1,n**2 do 900 j=1,n**2 stiff(i,j)=a(index(i,1),index(j,1)) & *ident(index(i,2),index(j,2))-a(index(j,2),index(i,2)) & *ident(index(i,1),index(j,1)) 900 continue 1000 continue call svdcmp(stiff,n**2,n**2,100,100,w,v) do 1850 k=1,n**2 if(dabs(w(k)).lt.1.0d-12)then m=m+1 do 1600 i=1,n**2 matrixcommute(index(i,1),index(i,2))=v(i,k) 1600 continue print*, '' print*, 'Commuting matrix ',m print*, '' do 2000 i=1,n print*, (matrixcommute(i,j),j=1,n) 2000 continue print*, ' ' error=norm2(matmul(matrixcommute(1:n,1:n),a(1:n,1:n))- & matmul(a(1:n,1:n),matrixcommute(1:n,1:n))) print*, 'Error norm ',error endif 1850 continue end SUBROUTINE svdcmp(a,m,n,mp,np,w,v) INTEGER m,mp,n,np,NMAX REAL*8 a(mp,np),v(np,np),w(np) PARAMETER (NMAX=10000) CU USES pythag INTEGER i,its,j,jj,k,l,nm REAL*8 anorm,c,f,g,h,s,scale,x,y,z,rv1(5000),pythag g=0.0d0 scale=0.0d0 anorm=0.0d0 do 25 i=1,n l=i+1 rv1(i)=scale*g g=0.0d0 s=0.0d0 scale=0.0d0 if(i.le.m)then do 11 k=i,m scale=scale+abs(a(k,i)) 11 continue if(scale.ne.0.0d0)then do 12 k=i,m a(k,i)=a(k,i)/scale s=s+a(k,i)*a(k,i) 12 continue f=a(i,i) g=-sign(sqrt(s),f) h=f*g-s a(i,i)=f-g do 15 j=l,n s=0.0d0 do 13 k=i,m s=s+a(k,i)*a(k,j) 13 continue f=s/h do 14 k=i,m a(k,j)=a(k,j)+f*a(k,i) 14 continue 15 continue do 16 k=i,m a(k,i)=scale*a(k,i) 16 continue endif endif w(i)=scale *g g=0.0d0 s=0.0d0 scale=0.0d0 if((i.le.m).and.(i.ne.n))then do 17 k=l,n scale=scale+abs(a(i,k)) 17 continue if(scale.ne.0.0d0)then do 18 k=l,n a(i,k)=a(i,k)/scale s=s+a(i,k)*a(i,k) 18 continue f=a(i,l) g=-sign(sqrt(s),f) h=f*g-s a(i,l)=f-g do 19 k=l,n rv1(k)=a(i,k)/h 19 continue do 23 j=l,m s=0.0 do 21 k=l,n s=s+a(j,k)*a(i,k) 21 continue do 22 k=l,n a(j,k)=a(j,k)+s*rv1(k) 22 continue 23 continue do 24 k=l,n a(i,k)=scale*a(i,k) 24 continue endif endif anorm=max(anorm,(abs(w(i))+abs(rv1(i)))) 25 continue do 32 i=n,1,-1 if(i.lt.n)then if(g.ne.0.0d0)then do 26 j=l,n v(j,i)=(a(i,j)/a(i,l))/g 26 continue do 29 j=l,n s=0.0d0 do 27 k=l,n s=s+a(i,k)*v(k,j) 27 continue do 28 k=l,n v(k,j)=v(k,j)+s*v(k,i) 28 continue 29 continue endif do 31 j=l,n v(i,j)=0.0d0 v(j,i)=0.0d0 31 continue endif v(i,i)=1.0d0 g=rv1(i) l=i 32 continue do 39 i=min(m,n),1,-1 l=i+1 g=w(i) do 33 j=l,n a(i,j)=0.0d0 33 continue if(g.ne.0.0)then g=1.0d0/g do 36 j=l,n s=0.0d0 do 34 k=l,m s=s+a(k,i)*a(k,j) 34 continue f=(s/a(i,i))*g do 35 k=i,m a(k,j)=a(k,j)+f*a(k,i) 35 continue 36 continue do 37 j=i,m a(j,i)=a(j,i)*g 37 continue else do 38 j= i,m a(j,i)=0.0d0 38 continue endif a(i,i)=a(i,i)+1.0d0 39 continue do 49 k=n,1,-1 do 48 its=1,30 do 41 l=k,1,-1 nm=l-1 if((abs(rv1(l))+anorm).eq.anorm) goto 2 if((abs(w(nm))+anorm).eq.anorm) goto 1 41 continue 1 c=0.0d0 s=1.0d0 do 43 i=l,k f=s*rv1(i) rv1(i)=c*rv1(i) if((abs(f)+anorm).eq.anorm) goto 2 g=w(i) h=pythag(f,g) w(i)=h h=1.0d0/h c= (g*h) s=-(f*h) do 42 j=1,m y=a(j,nm) z=a(j,i) a(j,nm)=(y*c)+(z*s) a(j,i)=-(y*s)+(z*c) 42 continue 43 continue 2 z=w(k) if(l.eq.k)then if(z.lt.0.0d0)then w(k)=-z do 44 j=1,n v(j,k)=-v(j,k) 44 continue endif goto 3 endif if(its.eq.30) then print*,'No convergence in svdcmp' endif x=w(l) nm=k-1 y=w(nm) g=rv1(nm) h=rv1(k) f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y) g=pythag(f,1.0d0) f=((x-z)*(x+z)+h*((y/(f+sign(g,f)))-h))/x c=1.0d0 s=1.0d0 do 47 j=l,nm i=j+1 g=rv1(i) y=w(i) h=s*g g=c*g z=pythag(f,h) rv1(j)=z c=f/z s=h/z f= (x*c)+(g*s) g=-(x*s)+(g*c) h=y*s y=y*c do 45 jj=1,n x=v(jj,j) z=v(jj,i) v(jj,j)= (x*c)+(z*s) v(jj,i)=-(x*s)+(z*c) 45 continue z=pythag(f,h) w(j)=z if(z.ne.0.0d0)then z=1.0d0/z c=f*z s=h*z endif f= (c*g)+(s*y) x=-(s*g)+(c*y) do 46 jj=1,m y=a(jj,j) z=a(jj,i) a(jj,j)= (y*c)+(z*s) a(jj,i)=-(y*s)+(z*c) 46 continue 47 continue rv1(l)=0.0d0 rv1(k)=f w(k)=x 48 continue 3 continue 49 continue return END C (C) Copr. 1986-92 Numerical Recipes Software v%1jw#<0(9p#3. C C FUNCTION pythag(a,b) REAL*8 a,b,pythag REAL*8 absa,absb absa=dabs(a) absb=dabs(b) if(absa.gt.absb)then pythag=absa*dsqrt(1.0d0+(absb/absa)**2) else if(absb.eq.0.0d0)then pythag=0.0d0 else pythag=absb*sqrt(1.0d0+(absa/absb)**2) endif endif return END C (C) Copr. 1986-92 Numerical Recipes Software v%1jw#<0(9p#3.