Changeset 4b6c75 in git


Ignore:
Timestamp:
Aug 1, 2001, 3:02:20 PM (23 years ago)
Author:
Mathias Schulze <mschulze@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
c71123eda14e4dc7793b9ff4bb5310155d39dd16
Parents:
1418c4ecec6f1dda76f77dca9a541a4f29998c7e
Message:
*mschulze: jordan output format and jordanmatrix input format changed; jordanbasis computes weight filtration


git-svn-id: file:///usr/local/Singular/svn/trunk@5556 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/LIB/linalg.lib

    r1418c4 r4b6c75  
    11//GMG last modified: 04/25/2000
    22//////////////////////////////////////////////////////////////////////////////
    3 version="$Id: linalg.lib,v 1.15 2001-07-30 16:38:12 mschulze Exp $";
     3version="$Id: linalg.lib,v 1.16 2001-08-01 13:02:20 mschulze Exp $";
    44category="Linear Algebra";
    55info="
     
    14451445///////////////////////////////////////////////////////////////////////////////
    14461446
    1447 proc jordan(matrix M,list #)
     1447proc jordan(matrix M)
    14481448"USAGE:   jordan(M); matrix M
    14491449ASSUME:  M constant square matrix, eigenvalues of M in coefficient field
     
    14511451@format
    14521452list l:
    1453   ideal l[1]: eigenvalues of M
    1454   list l[2]:
    1455     intvec l[2][i]:
    1456       int l[2][i][j]: size of Jordan block j of M with eigenvalue l[1][i]
     1453  ideal l[1]: eigenvalues of M in increasing order
     1454  intvec l[2]: corresponding Jordan block sizes
     1455  intvec l[3]: corresponding multiplicities
    14571456@end format
    14581457EXAMPLE: example jordan; shows examples
     
    14711470
    14721471  list l=eigenval(M);
    1473   def e,m=l[1..2];
     1472  def e0,m0=l[1..2];
     1473  kill l;
    14741474
    14751475  int i;
    1476   for(i=1;i<=ncols(e);i++)
    1477   {
    1478     if(deg(e[i]>0))
     1476  for(i=1;i<=ncols(e0);i++)
     1477  {
     1478    if(deg(e0[i]>0))
    14791479    {
    14801480      ERROR("eigenvalues in coefficient field expected");
     
    14841484
    14851485  int j,k;
    1486   matrix N,NN;
     1486  matrix N0,N1;
    14871487  module K0;
    14881488  list K;
    1489   intvec b0;
    1490   list b;
    1491 
    1492   for(i=ncols(e);i>0;i--)
    1493   {
    1494     N=M-e[i]*freemodule(ncols(M));
    1495 
     1489  ideal e;
     1490  intvec s,m;
     1491
     1492  for(i=1;i<=ncols(e0);i++)
     1493  {
     1494    N0=M-e0[i]*freemodule(ncols(M));
     1495
     1496    N1=N0;
    14961497    K0=0;
    1497     NN=N;
    14981498    K=module();
    1499     while(size(K0)<m[i])
     1499    while(size(K0)<m0[i])
    15001500    {
    1501       K0=syz(NN);
     1501      K0=syz(N1);
    15021502      K=K+list(K0);
    1503       NN=NN*N;
    1504     }
    1505 
    1506     b0=0;
    1507     b0[size(K[2])]=0;
    1508     for(j=size(K);j>1;j--)
     1503      N1=N1*N0;
     1504    }
     1505
     1506    for(j=2;j<size(K);j++)
    15091507    {
    1510       for(k=size(b0);k>size(b0)+size(K[j-1])-size(K[j]);k--)
     1508      if(2*size(K[j])-size(K[j-1])-size(K[j+1])>0)
    15111509      {
    1512         b0[k]=b0[k]+1;
    1513       }
    1514     }
    1515     b=list(b0)+b;
    1516   }
    1517 
    1518   l[2]=b;
    1519   return(l);
     1510        k++;
     1511        e[k]=e0[i];
     1512        s[k]=j-1;
     1513        m[k]=2*size(K[j])-size(K[j-1])-size(K[j+1]);
     1514      }
     1515    }
     1516    if(size(K[j])-size(K[j-1])>0)
     1517    {
     1518      k++;
     1519      e[k]=e0[i];
     1520      s[k]=j-1;
     1521      m[k]=size(K[j])-size(K[j-1]);
     1522    }
     1523  }
     1524
     1525  return(list(e,s,m));
    15201526}
    15211527example
     
    15311537"USAGE:   jordanbasis(M); matrix M
    15321538ASSUME:  M constant square matrix, eigenvalues of M in coefficient field
    1533 RETURN:  matrix U with inverse(U)*M*U in Jordan normal form
     1539RETURN:
     1540@format
     1541list l:
     1542  module l[1]: inverse(l[1])*M*l[1] has Jordan normal form
     1543  intvec l[2]: weight filtration indices of l[1] with center 0
     1544@end format
    15341545EXAMPLE: example jordanbasis; shows examples
    15351546"
     
    15661577  matrix u[ncols(M)][1];
    15671578  module U;
    1568 
    1569   for(i=ncols(e);i>0;i--)
     1579  intvec w;
     1580
     1581  for(i=ncols(e);i>=1;i--)
    15701582  {
    15711583    N0=M-e[i]*freemodule(ncols(M));
    15721584
     1585    N1=N0;
    15731586    K0=0;
    1574     N1=N0;
    1575     K=module();
     1587    K=list();
    15761588    while(size(K0)<m[i])
    15771589    {
     
    15821594
    15831595    K1=0;
    1584     for(j=2;j<size(K);j++)
     1596    for(j=1;j<size(K);j++)
    15851597    {
    15861598      K0=K[j];
     
    15901602    K[j]=interred(reduce(K[j],std(K1)));
    15911603
    1592     for(j=size(K);j>1;j--)
     1604    for(l=size(K);l>=1;l--)
    15931605    {
    1594       for(k=size(K[j]);k>0;k--)
     1606      for(k=size(K[l]);k>0;k--)
    15951607      {
    1596         u=K[j][k];
    1597         for(l=j;l>0;l--)
     1608        u=K[l][k];
     1609        for(j=l;j>=1;j--)
    15981610        {
    15991611          U=module(u)+U;
     1612          w=2*j-l-1,w;
    16001613          u=N0*u;
    16011614        }
     
    16031616    }
    16041617  }
    1605 
    1606   return(U);
     1618  w=w[1..size(w)-1];
     1619  return(list(U,w));
    16071620}
    16081621example
     
    16111624  matrix M[3][3]=3,2,1,0,2,1,0,0,3;
    16121625  print(M);
    1613   matrix U=jordanbasis(M);
    1614   print(U);
    1615   print(inverse(U)*M*U);
     1626  list l=jordanbasis(M);
     1627  print(l[1]);
     1628  print(l[2]);
     1629  print(inverse(l[1])*M*l[1]);
    16161630}
    16171631///////////////////////////////////////////////////////////////////////////////
    16181632
    1619 proc jordanmatrix(ideal e,list b)
    1620 "USAGE:   jordanmatrix(e,b); ideal e, list b
    1621 RETURN:  matrix J in Jordan normal form
    1622          with eigenvalues e and Jordan block sizes b
     1633proc jordanmatrix(ideal e,intvec s,intvec m)
     1634"USAGE:   jordanmatrix(e,s,m); ideal e, intvec s, intvec m
     1635RETURN:
     1636@format
     1637matrix J: Jordan normal form with eigenvalues e and Jordan block sizes s
     1638          with multiplicities m
     1639@end format
    16231640EXAMPLE: example jordanmatrix; shows examples
    16241641"
    16251642{
    1626   if(ncols(e)!=size(b))
     1643  if(ncols(e)!=size(s)||size(e)!=size(m))
    16271644  {
    16281645    ERROR("arguments of equal size expected");
    16291646  }
    16301647
    1631   int i,j,k,n;
    1632   for(i=ncols(e);i>=1;i--)
    1633   {
    1634     if(typeof(b[i])!="intvec")
     1648  int i,j,k,l;
     1649  int n=int((transpose(matrix(s))*matrix(m))[1,1]);
     1650  matrix J[n][n];
     1651  for(k=1;k<=ncols(e);k++)
     1652  {
     1653    for(l=1;l<=m[k];l++)
    16351654    {
    1636       ERROR("second argument of type list of intvec expected");
    1637     }
    1638     else
    1639     {
    1640       for(j=size(b[i]);j>=1;j--)
     1655      j++;
     1656      J[j,j]=e[k];
     1657      for(i=s[k];i>=2;i--)
    16411658      {
    1642         k=b[i][j];
    1643         if(k>0)
    1644         {
    1645           n=n+k;
    1646         }
    1647       }
    1648     }
    1649   }
    1650   matrix J[n][n];
    1651 
    1652   int l=1;
    1653   for(i=1;i<=ncols(e);i++)
    1654   {
    1655     for(j=1;j<=size(b[i]);j++)
    1656     {
    1657       k=b[i][j];
    1658       if(k>0)
    1659       {
    1660         while(k>=2)
    1661         {
    1662           J[l,l]=e[i];
    1663           J[l,l+1]=1;
    1664           k--;
    1665           l++;
    1666         }
    1667         J[l,l]=e[i];
    1668         l++;
     1659        J[j,j+1]=1;
     1660        j++;
     1661        J[j,j]=e[k];
    16691662      }
    16701663    }
     
    16771670  ring R=0,x,dp;
    16781671  ideal e=ideal(2,3);
    1679   list b=list(intvec(1),intvec(2));
    1680   print(jordanmatrix(e,b));
     1672  intvec s=1,2;
     1673  intvec m=1,1;
     1674  print(jordanmatrix(e,s,m));
    16811675}
    16821676///////////////////////////////////////////////////////////////////////////////
Note: See TracChangeset for help on using the changeset viewer.