Changeset 092430 in git
- Timestamp:
- Jun 21, 1999, 10:45:41 AM (24 years ago)
- Branches:
- (u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'a800fe4b3e9d37a38c5a10cc0ae9dfa0c15a4ee6')
- Children:
- 0f0974e0182296258c671cafb367b12244db65c1
- Parents:
- d694de170d576d5f00d6f1047b53246e20433998
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/jordan.lib
rd694de r092430 1 1 /////////////////////////////////////////////////////////////////////////////// 2 2 3 version="$Id: jordan.lib,v 1.1 1 1999-06-16 17:24:35mschulze Exp $";3 version="$Id: jordan.lib,v 1.12 1999-06-21 08:45:41 mschulze Exp $"; 4 4 info=" 5 5 LIBRARY: jordan.lib PROCEDURES TO COMPUTE THE JORDAN NORMAL FORM … … 17 17 static proc countblocks(matrix M) 18 18 { 19 int n;19 int b,r,r0; 20 20 21 21 int i=1; 22 int r,r0;23 22 while(i<=nrows(M)) 24 23 { 25 n++;24 b++; 26 25 r=nrows(M[i]); 27 26 r0=r; 28 27 28 dbprint(printlevel-voice+2,"//searching for block "+string(b)+"..."); 29 29 while(i<r0&&i<nrows(M)) 30 30 { … … 39 39 } 40 40 } 41 dbprint(printlevel-voice+2,"//...block "+string(b)+" found"); 41 42 42 43 i++; 43 44 } 44 45 45 return( n);46 return(b); 46 47 } 47 48 /////////////////////////////////////////////////////////////////////////////// … … 72 73 " 73 74 { 74 // check parameter M75 75 int n=nrows(M); 76 76 if(n==0) … … 85 85 } 86 86 87 // replace M by its constant part88 87 M=jet(M,0); 89 88 90 // try to increase number of blocks by transposing M 91 if(countblocks(M)<countblocks(transpose(M))) 92 { 89 dbprint(printlevel-voice+2,"//counting blocks of matrix..."); 90 int i=countblocks(M); 91 dbprint(printlevel-voice+2,"//...blocks of matrix counted"); 92 if(i==1) 93 { 94 dbprint(printlevel-voice+2,"//matrix has 1 block"); 95 } 96 else 97 { 98 dbprint(printlevel-voice+2,"//matrix has "+string(i)+" blocks"); 99 } 100 101 dbprint(printlevel-voice+2,"//counting blocks of transposed matrix..."); 102 int j=countblocks(transpose(M)); 103 dbprint(printlevel-voice+2,"//...blocks of transposed matrix counted"); 104 if(j==1) 105 { 106 dbprint(printlevel-voice+2,"//transposed matrix has 1 block"); 107 } 108 else 109 { 110 dbprint(printlevel-voice+2,"//transposed matrix has "+string(j)+" blocks"); 111 } 112 113 if(i<j) 114 { 115 dbprint(printlevel-voice+2,"//transposing matrix..."); 93 116 M=transpose(M); 94 }95 96 // compute eigenvalues eM and multiplicities mM of M 97 list f ac;117 dbprint(printlevel-voice+2,"//...matrix transposed"); 118 } 119 120 list fd; 98 121 matrix M0; 122 poly cp; 99 123 ideal eM,eM0; 100 124 intvec mM,mM0; 101 125 intvec u; 102 int i=1; 103 int j,r,r0; 126 int b,r,r0; 127 128 i=1; 104 129 while(i<=nrows(M)) 105 130 { 131 b++; 106 132 u=i; 107 133 r=nrows(M[i]); 108 134 r0=r; 109 135 110 // find next block136 dbprint(printlevel-voice+2,"//searching for block "+string(b)+"..."); 111 137 while(i<r0&&i<nrows(M)) 112 138 { … … 122 148 } 123 149 } 124 125 // if 1x1-block 150 dbprint(printlevel-voice+2,"//...block "+string(b)+" found"); 151 126 152 if(size(u)==1) 127 153 { 154 dbprint(printlevel-voice+2,"//1x1-block:"); 155 dbprint(printlevel-voice+2,M[u[1]][u[1]]); 156 128 157 if(mM[1]==0) 129 158 { … … 139 168 else 140 169 { 141 // factorize characteristic polynomial of block M0 170 dbprint(printlevel-voice+2, 171 "//"+string(size(u))+"x"+string(size(u))+"-block:"); 142 172 M0=getblock(M,u); 143 fac=factorize(det(M0-var(1)*freemodule(size(u))),2); 144 eM0,mM0=fac[1..2]; 145 146 // compute eigenvalues eM0 of M0 173 dbprint(printlevel-voice+2,M0); 174 175 dbprint(printlevel-voice+2,"//characteristic polynomial:"); 176 cp=det(module(M0-var(1)*freemodule(size(u)))); 177 dbprint(printlevel-voice+2,cp); 178 179 dbprint(printlevel-voice+2,"//factorizing characteristic polynomial..."); 180 fd=factorize(cp,2); 181 dbprint(printlevel-voice+2,"//...characteristic polynomial factorized"); 182 183 dbprint(printlevel-voice+2,"//computing eigenvalues..."); 184 eM0,mM0=fd[1..2]; 147 185 if(1<var(1)) 148 186 { … … 169 207 } 170 208 } 209 dbprint(printlevel-voice+2,"//...eigenvalues computed"); 171 210 172 211 if(mM[1]==0) … … 185 224 } 186 225 187 // sort eigenvalues226 dbprint(printlevel-voice+2,"//sorting eigenvalues..."); 188 227 poly e; 189 228 int m; … … 203 242 } 204 243 } 205 206 // remove multiple eigenvalues 244 dbprint(printlevel-voice+2,"//...eigenvalues sorted"); 245 246 dbprint(printlevel-voice+2,"//removing multiple eigenvalues..."); 207 247 i=1; 208 248 j=2; … … 217 257 i++; 218 258 eM[i]=eM[j]; 259 mM[i]=mM[j]; 219 260 } 220 261 j++; … … 222 263 eM=eM[1..i]; 223 264 mM=mM[1..i]; 224 225 // get optional parameter opt 265 dbprint(printlevel-voice+2,"//...multiple eigenvalues removed"); 266 267 dbprint(printlevel-voice+2,"//eigenvalues:"); 268 dbprint(printlevel-voice+2,eM); 269 dbprint(printlevel-voice+2,"//multiplicities:"); 270 dbprint(printlevel-voice+2,mM); 271 226 272 int opt=0; 227 273 if(size(#)>0) … … 236 282 return(list(eM)); 237 283 } 238 239 // define variables240 284 int k,l; 241 matrix E=freemodule(n);285 matrix I=freemodule(n); 242 286 matrix Mi,Ni; 243 287 module sNi; … … 256 300 for(i=ncols(eM);i>=1;i--) 257 301 { 258 Mi=M-eM[i]*E; 259 260 // compute kernels K of powers of Mi 302 Mi=M-eM[i]*I; 303 304 dbprint(printlevel-voice+2, 305 "//computing kernels of powers of matrix minus eigenvalue " 306 +string(eM[i])); 261 307 K=list(module()); 262 308 for(Ni,sNi=Mi,0;size(sNi)<mM[i];Ni=Ni*Mi) … … 265 311 K=K+list(sNi); 266 312 } 313 dbprint(printlevel-voice+2,"//...kernels computed"); 267 314 268 315 if(opt<=1) 269 316 { 270 // compute Jordan block size vector bMi corresponding to eigenvalue eM[i] 317 dbprint(printlevel-voice+2, 318 "//computing Jordan block sizes for eigenvalue " 319 +string(eM[i])+"..."); 271 320 bMi=0; 272 321 bMi[size(K[2])]=0; … … 279 328 } 280 329 bM=list(bMi)+bM; 330 dbprint(printlevel-voice+2,"//...Jordan block sizes computed"); 281 331 } 282 332 283 333 if(opt>=1) 284 334 { 285 // compute Jordan basis vectors K corresponding to eigenvalue eM[i] 335 dbprint(printlevel-voice+2, 336 "//computing Jordan basis vectors for eigenvalue " 337 +string(eM[i])+"..."); 286 338 if(size(K)>1) 287 339 { … … 306 358 } 307 359 } 360 dbprint(printlevel-voice+2,"//...Jordan basis vectors computed"); 308 361 } 309 362 } … … 336 389 " 337 390 { 338 // check parameters339 391 if(size(jd)<2) 340 392 { … … 365 417 } 366 418 367 // get size of Jordan matrix368 419 int i,j,k,n; 369 420 for(i=s;i>=1;i--) … … 388 439 } 389 440 390 // create Jordan matrix391 441 int l; 392 442 matrix J[n][n];
Note: See TracChangeset
for help on using the changeset viewer.