Changeset 4b6c75 in git
- Timestamp:
- Aug 1, 2001, 3:02:20 PM (22 years ago)
- Branches:
- (u'spielwiese', '91fdef05f09f54b8d58d92a472e9c4a43aa4656f')
- Children:
- c71123eda14e4dc7793b9ff4bb5310155d39dd16
- Parents:
- 1418c4ecec6f1dda76f77dca9a541a4f29998c7e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/linalg.lib
r1418c4 r4b6c75 1 1 //GMG last modified: 04/25/2000 2 2 ////////////////////////////////////////////////////////////////////////////// 3 version="$Id: linalg.lib,v 1.1 5 2001-07-30 16:38:12mschulze Exp $";3 version="$Id: linalg.lib,v 1.16 2001-08-01 13:02:20 mschulze Exp $"; 4 4 category="Linear Algebra"; 5 5 info=" … … 1445 1445 /////////////////////////////////////////////////////////////////////////////// 1446 1446 1447 proc jordan(matrix M ,list #)1447 proc jordan(matrix M) 1448 1448 "USAGE: jordan(M); matrix M 1449 1449 ASSUME: M constant square matrix, eigenvalues of M in coefficient field … … 1451 1451 @format 1452 1452 list 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 1457 1456 @end format 1458 1457 EXAMPLE: example jordan; shows examples … … 1471 1470 1472 1471 list l=eigenval(M); 1473 def e,m=l[1..2]; 1472 def e0,m0=l[1..2]; 1473 kill l; 1474 1474 1475 1475 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)) 1479 1479 { 1480 1480 ERROR("eigenvalues in coefficient field expected"); … … 1484 1484 1485 1485 int j,k; 1486 matrix N ,NN;1486 matrix N0,N1; 1487 1487 module K0; 1488 1488 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; 1496 1497 K0=0; 1497 NN=N;1498 1498 K=module(); 1499 while(size(K0)<m [i])1499 while(size(K0)<m0[i]) 1500 1500 { 1501 K0=syz(N N);1501 K0=syz(N1); 1502 1502 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++) 1509 1507 { 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) 1511 1509 { 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)); 1520 1526 } 1521 1527 example … … 1531 1537 "USAGE: jordanbasis(M); matrix M 1532 1538 ASSUME: M constant square matrix, eigenvalues of M in coefficient field 1533 RETURN: matrix U with inverse(U)*M*U in Jordan normal form 1539 RETURN: 1540 @format 1541 list 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 1534 1545 EXAMPLE: example jordanbasis; shows examples 1535 1546 " … … 1566 1577 matrix u[ncols(M)][1]; 1567 1578 module U; 1568 1569 for(i=ncols(e);i>0;i--) 1579 intvec w; 1580 1581 for(i=ncols(e);i>=1;i--) 1570 1582 { 1571 1583 N0=M-e[i]*freemodule(ncols(M)); 1572 1584 1585 N1=N0; 1573 1586 K0=0; 1574 N1=N0; 1575 K=module(); 1587 K=list(); 1576 1588 while(size(K0)<m[i]) 1577 1589 { … … 1582 1594 1583 1595 K1=0; 1584 for(j= 2;j<size(K);j++)1596 for(j=1;j<size(K);j++) 1585 1597 { 1586 1598 K0=K[j]; … … 1590 1602 K[j]=interred(reduce(K[j],std(K1))); 1591 1603 1592 for( j=size(K);j>1;j--)1604 for(l=size(K);l>=1;l--) 1593 1605 { 1594 for(k=size(K[ j]);k>0;k--)1606 for(k=size(K[l]);k>0;k--) 1595 1607 { 1596 u=K[ j][k];1597 for( l=j;l>0;l--)1608 u=K[l][k]; 1609 for(j=l;j>=1;j--) 1598 1610 { 1599 1611 U=module(u)+U; 1612 w=2*j-l-1,w; 1600 1613 u=N0*u; 1601 1614 } … … 1603 1616 } 1604 1617 } 1605 1606 return( U);1618 w=w[1..size(w)-1]; 1619 return(list(U,w)); 1607 1620 } 1608 1621 example … … 1611 1624 matrix M[3][3]=3,2,1,0,2,1,0,0,3; 1612 1625 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]); 1616 1630 } 1617 1631 /////////////////////////////////////////////////////////////////////////////// 1618 1632 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 1633 proc jordanmatrix(ideal e,intvec s,intvec m) 1634 "USAGE: jordanmatrix(e,s,m); ideal e, intvec s, intvec m 1635 RETURN: 1636 @format 1637 matrix J: Jordan normal form with eigenvalues e and Jordan block sizes s 1638 with multiplicities m 1639 @end format 1623 1640 EXAMPLE: example jordanmatrix; shows examples 1624 1641 " 1625 1642 { 1626 if(ncols(e)!=size( b))1643 if(ncols(e)!=size(s)||size(e)!=size(m)) 1627 1644 { 1628 1645 ERROR("arguments of equal size expected"); 1629 1646 } 1630 1647 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++) 1635 1654 { 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--) 1641 1658 { 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]; 1669 1662 } 1670 1663 } … … 1677 1670 ring R=0,x,dp; 1678 1671 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)); 1681 1675 } 1682 1676 ///////////////////////////////////////////////////////////////////////////////
Note: See TracChangeset
for help on using the changeset viewer.