Changeset 8061:f6e69c171fb5
- Timestamp:
- 12/13/07 03:37:21 (6 years ago)
- Branch:
- default
- File:
-
- 1 edited
-
sage/groups/matrix_gps/matrix_group.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
sage/groups/matrix_gps/matrix_group.py
r6486 r8061 7 7 methods; examples (2006-03-15) 8 8 William Stein (2006-12) -- rewrite 9 DJ (2007-12) -- Added invariant_generators (with M Albrecht, S King) 9 10 10 11 This class is designed for computing with matrix groups defined by a … … 54 55 # http://www.gnu.org/licenses/ 55 56 ############################################################################## 57 56 58 57 59 from matrix_group_element import MatrixGroupElement … … 662 664 gens = ', '.join([latex(x) for x in self.gens()]) 663 665 return '\\left\\langle %s \\right\\rangle'%gens 666 667 def invariant_generators(self): 668 """ 669 Wraps Singular's invariant_algebra_reynolds and invariant_ring 670 in finvar.lib, with help from Simon King and Martin Albrecht. 671 Computes generators for the polynomial ring F[x1,...,xn]^G, where 672 G in GL(n,F) is a finite matrix group. 673 674 In the "good characteristic" case the polynomials returned form a 675 minimal generating set for the algebra of G-invariant polynomials. 676 In the "bad" case, the polynomials returned are primary and 677 secondary invariants, forming a not necessarily minimal generating 678 set for the algebra of G-invariant polynomials. 679 680 EXAMPLES: 681 sage: F = GF(7); MS = MatrixSpace(F,2,2) 682 sage: gens = [MS([[0,1],[-1,0]]),MS([[1,1],[2,3]])] 683 sage: G = MatrixGroup(gens) 684 sage: G.invariant_generators() 685 [x1^7*x2 - x1*x2^7, x1^12 - 2*x1^9*x2^3 - x1^6*x2^6 + 2*x1^3*x2^9 + x2^12, x1^18 + 2*x1^15*x2^3 + 3*x1^12*x2^6 + 3*x1^6*x2^12 - 2*x1^3*x2^15 + x2^18] 686 sage: q = 4; a = 2 687 sage: MS = MatrixSpace(QQ, 2, 2) 688 sage: gen1 = [[1/a,(q-1)/a],[1/a, -1/a]]; gen2 = [[1,0],[0,-1]]; gen3 = [[-1,0],[0,1]] 689 sage: G = MatrixGroup([MS(gen1),MS(gen2),MS(gen3)]) 690 sage: G.order() 691 12 692 sage: G.invariant_generators() 693 [x1^2 + 3*x2^2, x1^6 + 15*x1^4*x2^2 + 15*x1^2*x2^4 + 33*x2^6] 694 sage: F = GF(5); MS = MatrixSpace(F,2,2) 695 sage: gens = [MS([[1,2],[-1,1]]),MS([[1,1],[-1,1]])] 696 sage: G = MatrixGroup(gens) 697 sage: G.invariant_generators() ## takes a long time (several mins) 698 [x1^20 + x1^16*x2^4 + x1^12*x2^8 + x1^8*x2^12 + x1^4*x2^16 + x2^20, 699 x1^20*x2^4 + x1^16*x2^8 + x1^12*x2^12 + x1^8*x2^16 + x1^4*x2^20] 700 701 702 AUTHORS: 703 David Joyner, Simon King and Martin Albrecht. 704 705 REFERENCES: 706 1. Singular reference manual 707 2. B. Sturmfels, "Algorithms in invariant theory", Springer-Verlag, 708 1993. 709 3. S. King, "Minimal Generating Sets of non-modular invariant 710 rings of finite groups", arXiv:math.AC/0703035 711 712 """ 713 from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing 714 from sage.interfaces.singular import singular 715 gens = self.gens() 716 n = len((gens[0].matrix()).rows()) 717 F = self.base_ring() 718 q = F.characteristic() 719 singular.LIB("finvar.lib") 720 VarNames=','.join(('x%s'%(i+1) for i in range(n))) 721 R = singular.ring(q,'(%s)'%VarNames,'dp') 722 A = [singular.matrix(n,n,str((x.matrix()).list())) for x in gens] 723 #print singular(A) 724 Lgens = ','.join((x.name() for x in A)) 725 # REMARK: This is simpler than making a loop and cutting of the last ',' 726 #print "A: ",A,"\n Lgens: ",Lgens 727 PR = PolynomialRing(F,n,["x%s"%i for i in range(1,n+1)]) 728 #singular.eval('matrix P,S,IS=invariant_ring((%s))'%Lgens) 729 if q == 0 or (q > 0 and self.order()%q != 0): 730 ReyName = singular._next_var_name() 731 singular.eval('list %s=group_reynolds((%s))'%(ReyName,Lgens)) 732 IRName = singular._next_var_name() 733 singular.eval('matrix %s = invariant_algebra_reynolds(%s[1])'%(IRName,ReyName)) 734 return [PR(singular(IRName+'[1,%s]'%n)) for n in range(1,1+singular('ncols('+IRName+')'))] 735 if self.order()%q == 0: 736 PName = singular._next_var_name() 737 SName = singular._next_var_name() 738 singular.eval('matrix %s,%s=invariant_ring(%s)'%(PName,SName,Lgens)) 739 return [PR(singular(PName+'[1,%s]'%n)) for n in range(1,1+singular('ncols('+PName+')'))]+[PR(singular(SName+'[1,%s]'%n)) for n in range(2,1+singular('ncols('+SName+')'))] 664 740 665 741 class MatrixGroup_gens_finite_field(MatrixGroup_gens, MatrixGroup_gap_finite_field):
Note: See TracChangeset
for help on using the changeset viewer.
