Changeset 558eb2 in git
- Timestamp:
- Dec 22, 2000, 2:46:04 PM (22 years ago)
- Branches:
- (u'spielwiese', '0d6b7fcd9813a1ca1ed4220cfa2b104b97a0a003')
- Children:
- 803c5a17d620ffa41d14efaab791dcf17ad1f7a4
- Parents:
- 4ac99747f8f23db40f8b7dcb05fd07c448b76b0f
- Location:
- Singular/LIB
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/equising.lib
r4ac997 r558eb2 1 version="$Id: equising.lib,v 1. 4 2000-12-22 13:43:10greuel Exp $";1 version="$Id: equising.lib,v 1.5 2000-12-22 13:44:24 greuel Exp $"; 2 2 category="Singularities"; 3 3 info=" 4 LIBRARY: equising.lib E QUISINGULARITY STRATUM OF A FAMILY OF PLANE CURVES4 LIBRARY: equising.lib Equisingularity Stratum of a Family of Plane Curves 5 5 AUTHOR: Andrea Mindnich, e-mail:mindnich@mathematik.uni-kl.de 6 6 -
Singular/LIB/finvar.lib
r4ac997 r558eb2 1 // $Id: finvar.lib,v 1.28 2000-12-19 15:05:21 anne Exp $2 // author: Agnes Eileen Heydtmann, email:agnes@math.uni-sb.de3 1 // last change: 98/11/05 4 2 /////////////////////////////////////////////////////////////////////////////// 5 version="$Id: finvar.lib,v 1.2 8 2000-12-19 15:05:21 anneExp $"3 version="$Id: finvar.lib,v 1.29 2000-12-22 13:46:04 greuel Exp $" 6 4 category="Invariant theory"; 7 5 info=" 8 LIBRARY: finvar.lib LIBRARY TO CALCULATE INVARIANT RINGS OF FINITE GROUPS6 LIBRARY: finvar.lib Invariant Rings of Finite Groups 9 7 AUTHOR: Agnes E. Heydtmann, email: agnes@math.uni-sb.de 10 8 9 OVERVIEW: 11 10 A library for computing polynomial invariants of finite matrix groups and 12 11 generators of related varieties. The algorithms are based on B. Sturmfels, … … 19 18 primary_invariants_random() primary invariants, randomized alg. 20 19 21 SUBPROCEDURES:20 AUXILIARY PROCEDURES: 22 21 cyclotomic() cyclotomic polynomial 23 22 group_reynolds() finite group and Reynolds operator (R.o.) … … 154 153 EXAMPLE: example group_reynolds; shows an example 155 154 " 156 { int ch=char(basering); 157 158 159 int gen_num; 155 { int ch=char(basering); // the existance of the Reynolds operator 156 // is dependent on the characteristic of 157 // the base field 158 int gen_num; // number of generators 160 159 //------------------------ making sure the input is okay --------------------- 161 160 if (typeof(#[size(#)])=="int") … … 191 190 // operator - 192 191 matrix G(1)=#[1]; // G(k) are elements of the group - 193 if (ch<>0 && minpoly==0 && gen_num<>1) // finding out of which order the group194 { matrix I=diag(1,n); //element is192 if (ch<>0 && minpoly==0 && gen_num<>1) // finding out of which order the 193 { matrix I=diag(1,n); // group element is 195 194 matrix TEST=G(1); 196 195 int o1=1; … … 258 257 g++; 259 258 matrix G(g)=P(k); // a new group element - 260 if (ch<>0 && minpoly==0 && i<>1) // finding out of which order the group261 { TEST=G(g); //element is259 if (ch<>0 && minpoly==0 && i<>1) // finding out of which order the 260 { TEST=G(g); //group element is 262 261 o2=1; 263 262 while (TEST<>I) … … 284 283 ""; 285 284 } 286 REY=transpose(REY); 287 288 285 REY=transpose(REY); // when we evaluate the Reynolds operator 286 // later on, we actually want 1xn 287 // matrices 289 288 if (ch<>0) 290 289 { if ((g%ch)==0) … … 575 574 map slead=br,ideal(0); 576 575 s=slead(M); 577 M[1,1]=1/s[1,1]*M[1,1]; 578 M[1,2]=1/s[1,2]*M[1,2]; 576 M[1,1]=1/s[1,1]*M[1,1]; // numerator and denominator have to have 577 M[1,2]=1/s[1,2]*M[1,2]; // a constant term of 1 579 578 if (v) 580 579 { ""; … … 592 591 } 593 592 //------ preparing everything for Brauer lifts into characteristic 0 --------- 594 ring Q=0,x,dp; 595 596 597 598 599 600 601 poly minq=cyclotomic(r); 602 603 593 ring Q=0,x,dp; // we want to extend our ring as well as 594 // the ring of rational numbers Q to 595 // contain r-th primitive roots of unity 596 // in order to factor characteristic 597 // polynomials of group elements into 598 // linear factors and lift eigenvalues to 599 // characteristic 0 - 600 poly minq=cyclotomic(r); // minq now contains the size-of-group-th 601 // cyclotomic polynomial of Q, it is 602 // irreducible there 604 603 ring `newring`=(0,e),x,dp; 605 604 map f=Q,ideal(e); … … 627 626 // to this new extension field bre 628 627 matrix xI=diag(x,n); 629 poly p; 630 631 list L; 632 ideal F; 633 intvec C; 628 poly p; // used for the characteristic polynomial 629 // to factor - 630 list L; // will contain the linear factors of the 631 ideal F; // characteristic polynomial of the group 632 intvec C; // elements and their powers 634 633 int i, j, k; 635 634 // -------------- finding all the terms of the Molien series ----------------- … … 645 644 } 646 645 setring bre; 647 p=det(xI-f2(G(i))); 646 p=det(xI-f2(G(i))); // characteristic polynomial of G(i) 648 647 L=factorize(p); 649 648 F=L[1]; 650 649 C=L[2]; 651 650 for (j=2;j<=ncols(F);j++) 652 { F[j]=-1*(F[j]-x); 653 654 655 k=exponent(number(F[j]),e); 651 { F[j]=-1*(F[j]-x); // F[j] is now an eigenvalue of G(i), 652 // it is a power of a primitive r-th root 653 // of unity - 654 k=exponent(number(F[j]),e); // F[j]==e^k 656 655 setring `newring`; 657 p=p*(1-x*(e^k))^C[j]; 658 setring bre; 656 p=p*(1-x*(e^k))^C[j]; // building the denominator of the new 657 setring bre; // term 659 658 } 660 659 // ----------- … … 731 730 } 732 731 map slead=`newring`,ideal(0); 733 s=slead(M); 734 M[1,1]=1/s[1,1]*M[1,1]; 732 s=slead(M); // forcing the constant term of numerator 733 M[1,1]=1/s[1,1]*M[1,1]; // and denominator to be 1 735 734 M[1,2]=1/s[1,2]*M[1,2]; 736 735 kill slead; … … 738 737 kill p; 739 738 } 740 else 741 { ring `newring`=0,x,dp; 742 matrix M[1][2]=1,(1-x)^n; 743 } 744 export `newring`; 745 export M; 746 setring br; 739 else // if the group only contains an identity 740 { ring `newring`=0,x,dp; // element, it is very easy to calculate 741 matrix M[1][2]=1,(1-x)^n; // the Molien series 742 } 743 export `newring`; // we keep the ring where we computed the 744 export M; // Molien series in such that we can 745 setring br; // keep it 747 746 if (v) 748 747 { " We are done calculating the Molien series."; … … 750 749 } 751 750 } 752 else 753 { 754 755 756 757 751 else // i.e. char<>0 and mol_flag<>0, the user 752 { // has specified that we are dealing with 753 // a ring of large characteristic which 754 // can be treated like a ring of 755 // characteristic 0; we'll avoid the 756 // Brauer lifts 758 757 //----------------------- simulating characteristic 0 ------------------------ 759 758 string chst=charstr(br); … … 845 844 map slead=`newring`,ideal(0); 846 845 s=slead(M); 847 M[1,1]=1/s[1,1]*M[1,1]; 848 M[1,2]=1/s[1,2]*M[1,2]; 846 M[1,1]=1/s[1,1]*M[1,1]; // numerator and denominator have to have 847 M[1,2]=1/s[1,2]*M[1,2]; // a constant term of 1 849 848 if (v) 850 849 { ""; … … 853 852 } 854 853 kill G(1..g), s, slead, p, v1, I; 855 export `newring`; 856 export M; 857 setring br; 854 export `newring`; // we keep the ring where we computed the 855 export M; // the Molien series such that we can 856 setring br; // keep it 858 857 } 859 858 } … … 1142 1141 ""; 1143 1142 } 1144 A(1)=transpose(A(1)); 1145 1146 1147 if (interval==0) 1148 { 1149 s=matrix(syz(ideal(A(2)))); 1150 A(2)[1,1]=-s[2,1]; 1151 A(2)[1,2]=s[1,1]; 1143 A(1)=transpose(A(1)); // when we evaluate the Reynolds operator 1144 // later on, we actually want 1xn 1145 // matrices 1146 if (interval==0) // canceling common terms of denominator 1147 { // and enumerator - 1148 s=matrix(syz(ideal(A(2)))); // once gcd() is faster than syz() 1149 A(2)[1,1]=-s[2,1]; // these three lines should be replaced 1150 A(2)[1,2]=s[1,1]; // by the following three 1152 1151 // p=gcd(A(2)[1,1],A(2)[1,2]); 1153 1152 // A(2)[1,1]=A(2)[1,1]/p; … … 1167 1166 map slead=br,ideal(0); 1168 1167 s=slead(A(2)); 1169 A(2)[1,1]=1/s[1,1]*A(2)[1,1]; 1170 A(2)[1,2]=1/s[1,2]*A(2)[1,2]; 1168 A(2)[1,1]=1/s[1,1]*A(2)[1,1]; // numerator and denominator have to have 1169 A(2)[1,2]=1/s[1,2]*A(2)[1,2]; // a constant term of 1 1171 1170 if (v) 1172 1171 { " Now we are done calculating Molien series and Reynolds operator."; … … 1391 1390 map slead=`newring`,ideal(0); 1392 1391 s=slead(A(2)); 1393 A(2)[1,1]=1/s[1,1]*A(2)[1,1]; 1394 A(2)[1,2]=1/s[1,2]*A(2)[1,2]; 1392 A(2)[1,1]=1/s[1,1]*A(2)[1,1]; // numerator and denominator have to have 1393 A(2)[1,2]=1/s[1,2]*A(2)[1,2]; // a constant term of 1 1395 1394 if (v) 1396 1395 { " Now we are done calculating Molien series and Reynolds operator."; … … 1399 1398 matrix M=A(2); 1400 1399 kill G(1..g), s, slead, p, v1, I, A(2); 1401 export `newring`; 1402 export M; 1403 setring br; 1400 export `newring`; // we keep the ring where we computed the 1401 export M; // the Molien series such that we can 1402 setring br; // keep it 1404 1403 return(A(1)); 1405 1404 } … … 1461 1460 1462 1461 if (size(#)==0) 1463 { A(2)=M[1,1]; 1464 1465 1466 } 1462 { A(2)=M[1,1]; // if a third parameter is not given, the 1463 // intermediate result from the last run 1464 // corresponds to the numerator - we need 1465 } // its smallest term 1467 1466 else 1468 1467 { if (typeof(#[1])=="poly") 1469 { A(2)=#[1]; 1470 } 1468 { A(2)=#[1]; // if a third term is given we 'start' 1469 } // with its smallest term 1471 1470 else 1472 1471 { "ERROR: <poly> as third parameter expected"; … … 1474 1473 } 1475 1474 } 1476 poly A(1)=M[1,2]; 1475 poly A(1)=M[1,2]; // denominator of Molien series (for now) 1477 1476 string mp=string(minpoly); 1478 1477 execute("ring R=("+charstr(br)+"),("+varstr(br)+"),ds;"); 1479 1478 execute("minpoly=number("+mp+");"); 1480 poly A(1)=0; 1481 poly min; 1482 poly A(2)=fetch(br,A(2)); 1479 poly A(1)=0; // A(1) will contain the sum of n terms - 1480 poly min; // min will be our smallest term - 1481 poly A(2)=fetch(br,A(2)); // fetching A(2) and M[1,2] into R 1483 1482 poly den=fetch(br,A(1)); 1484 for (int i=1; i<=n; i++) / /getting n terms and adding them up1483 for (int i=1; i<=n; i++) / getting n terms and adding them up 1485 1484 { min=lead(A(2)); 1486 1485 A(1)=A(1)+min; 1487 1486 A(2)=A(2)-min*den; 1488 1487 } 1489 setring br; 1490 A(1)=fetch(R,A(1)); 1488 setring br; // moving A(1) and A(2) back in the 1489 A(1)=fetch(R,A(1)); // actual ring for output 1491 1490 A(2)=fetch(R,A(2)); 1492 1491 return(A(1..2)); … … 1510 1509 p(1); 1511 1510 } 1511 /////////////////////////////////////////////////////////////////////////////// 1512 1512 1513 1513 proc evaluate_reynolds (matrix REY, ideal I) … … 1558 1558 print(evaluate_reynolds(L[1],I)); 1559 1559 } 1560 /////////////////////////////////////////////////////////////////////////////// 1560 1561 1561 1562 proc invariant_basis (int g,list #) … … 1786 1787 } 1787 1788 } 1788 B=minbase(B); 1789 B=minbase(B); // here are the linearly independent ones 1789 1790 degBound=DEGB; 1790 1791 return(B); … … 1806 1807 } 1807 1808 } 1808 B=minbase(B+part_mon); 1809 B=minbase(B+part_mon); // here are the linearly independent ones 1809 1810 if (upper_bound==j) 1810 1811 { degBound=DEGB; … … 1859 1860 } 1860 1861 else 1861 { vec[1,i]=-vec[1,i]; 1862 } 1863 } 1864 for (i=2;i<=n-1;i++) 1862 { vec[1,i]=-vec[1,i]; // make all negatives before positives 1863 } // positive 1864 } 1865 for (i=2;i<=n-1;i++) // case: 1,p,...,p after 1,n,...,n 1865 1866 { if (vec[1,i]>0) 1866 { vec[1,2]=vec[1,i]-1; 1867 if (i>2) 1867 { vec[1,2]=vec[1,i]-1; // shuffleing things around... 1868 if (i>2) // same sum of absolute values of entries 1868 1869 { vec[1,i]=0; 1869 1870 } … … 1892 1893 i=(-1)*i; 1893 1894 } 1894 i=i%p^d; 1895 number a=par(1); 1896 number out=0; 1897 int j=1; 1895 i=i%p^d; // base field has p^d elements - 1896 number a=par(1); // a is the root of the minpoly - we have 1897 number out=0; // to construct a linear combination of 1898 int j=1; // a^k 1898 1899 int k; 1899 1900 while (1) … … 1986 1987 ring R=0,x,dp; // just to calculate next variable 1987 1988 // bound - 1988 number bound=(number(p)^(ext_deg*cd)-1)/(number(p)^ext_deg-1)+1; // this is1989 // how many linearly independent vectors1990 // of size cd exist having entries in the1991 // base field of br1989 number bound=(number(p)^(ext_deg*cd)-1)/(number(p)^ext_deg-1)+1; 1990 // this is how many linearly independent 1991 // vectors of size cd exist having 1992 // entries in the base field of br 1992 1993 setring br; 1993 1994 intvec h; // Hilbert series … … 1997 1998 while (k<=i+dif) 1998 1999 { CI=CI+ideal(var(k)^d); // homogeneous polynomial of the same 1999 // 2000 //degree as the one we're looking for is 2000 2001 // added 2001 2002 // h=hilb(std(CI),1); … … 2008 2009 { pnew[1,j]=int_number_map(new[1,j]); // mapping an integer into br 2009 2010 } 2010 if (unique(vec(1..counter),pnew)) // 2011 if (unique(vec(1..counter),pnew)) //checking whether we tried pnew before 2011 2012 { counter++; 2012 2013 matrix vec(counter)=pnew; // keeping track of the ones we tried - … … 2486 2487 print(l[1]); 2487 2488 } 2489 /////////////////////////////////////////////////////////////////////////////// 2488 2490 2489 2491 proc primary_charp_no_molien (matrix REY, list #) … … 5797 5799 print(image_of_variety(I,F)); 5798 5800 } 5801 ///////////////////////////////////////////////////////////////////////////////
Note: See TracChangeset
for help on using the changeset viewer.