Changeset 8061:f6e69c171fb5


Ignore:
Timestamp:
12/13/07 03:37:21 (6 years ago)
Author:
David Joyner <wdjoyner@…>
Branch:
default
Message:

dded invariant_generators (with S King, M Albrecht) - wdj

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sage/groups/matrix_gps/matrix_group.py

    r6486 r8061  
    77                    methods; examples (2006-03-15) 
    88   William Stein (2006-12) -- rewrite 
     9   DJ (2007-12) -- Added invariant_generators (with M Albrecht, S King) 
    910 
    1011This class is designed for computing with matrix groups defined by a 
     
    5455#                  http://www.gnu.org/licenses/ 
    5556############################################################################## 
     57 
    5658 
    5759from matrix_group_element import MatrixGroupElement 
     
    662664        gens = ', '.join([latex(x) for x in self.gens()]) 
    663665        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+')'))] 
    664740 
    665741class MatrixGroup_gens_finite_field(MatrixGroup_gens, MatrixGroup_gap_finite_field): 
Note: See TracChangeset for help on using the changeset viewer.