def subgroup(self, generators, check=True): """ Return the subgroup generated by the given generators. INPUT: - ``generators`` -- a list/tuple/iterable of group elements of self - ``check`` -- boolean (optional, default: ``True``). Whether to check that each matrix is invertible. OUTPUT: The subgroup generated by ``generators`` as an instance of FinitelyGeneratedMatrixGroup_gap EAMPLES:: sage: UCF = UniversalCyclotomicField() sage: G = GL(3, UCF) sage: e3 = UCF.gen(3); e5 =UCF.gen(5) sage: m = matrix(UCF, 3,3, [[e3, 1, 0], [0, e5, 7],[4, 3, 2]]) sage: S = G.subgroup([m]); S Subgroup with 1 generators ( [E(3) 1 0] [ 0 E(5) 7] [ 4 3 2] ) of General Linear Group of degree 3 over Universal Cyclotomic Field sage: CF3 = CyclotomicField(3) sage: G = GL(3, CF3) sage: e3 = CF3.gen() sage: m = matrix(CF3, 3,3, [[e3, 1, 0], [0, ~e3, 7],[4, 3, 2]]) sage: S = G.subgroup([m]); S Subgroup with 1 generators ( [ zeta3 1 0] [ 0 -zeta3 - 1 7] [ 4 3 2] ) of General Linear Group of degree 3 over Cyclotomic Field of order 3 and degree 2 TESTS:: sage: TestSuite(G).run() sage: TestSuite(S).run() """ # this method enlarges the method with same name of ParentLibGAP to cases where the ambient group is not inheritet from ParentLibGAP. if isinstance(self, ParentLibGAP): return ParentLibGAP.subgroup(self, generators) for g in generators: if g not in self: raise ValueError("generator %s is not in the group"%(g)) from sage.groups.matrix_gps.finitely_generated import MatrixGroup subgroup = MatrixGroup(generators, check=check) subgroup._ambient = self return subgroup
def image_mod_n(self): r""" Return the image of this group in `SL(2, \ZZ / N\ZZ)`. EXAMPLE:: sage: Gamma0(3).image_mod_n() Matrix group over Ring of integers modulo 3 with 2 generators ( [2 0] [1 1] [0 2], [0 1] ) TEST:: sage: for n in [2..20]: ... for g in Gamma0(n).gamma_h_subgroups(): ... G = g.image_mod_n() ... assert G.order() == Gamma(n).index() / g.index() """ N = self.level() if N == 1: raise NotImplementedError( "Matrix groups over ring of integers modulo 1 not implemented") gens = [ matrix(Zmod(N), 2, 2, [x, 0, 0, Zmod(N)(1) / x]) for x in self._generators_for_H() ] gens += [matrix(Zmod(N), 2, [1, 1, 0, 1])] return MatrixGroup(gens)
def as_matrix_group(self): """ Return a new matrix group from the generators. This will throw away any extra structure (encoded in a derived class) that a group of special matrices has. EXAMPLES:: sage: G = SU(4,GF(5)) sage: G.as_matrix_group() Matrix group over Finite Field in a of size 5^2 with 2 generators ( [ a 0 0 0] [ 1 0 4*a + 3 0] [ 0 2*a + 3 0 0] [ 1 0 0 0] [ 0 0 4*a + 1 0] [ 0 2*a + 4 0 1] [ 0 0 0 3*a], [ 0 3*a + 1 0 0] ) sage: G = GO(3,GF(5)) sage: G.as_matrix_group() Matrix group over Finite Field of size 5 with 2 generators ( [2 0 0] [0 1 0] [0 3 0] [1 4 4] [0 0 1], [0 2 1] ) """ from sage.groups.matrix_gps.finitely_generated import MatrixGroup return MatrixGroup(self.gens())
def image_mod_n(self): r""" Return the image of this group modulo `N`, as a subgroup of `SL(2, \ZZ / N\ZZ)`. This is just the trivial subgroup. EXAMPLE:: sage: Gamma(3).image_mod_n() Matrix group over Ring of integers modulo 3 with 1 generators ( [1 0] [0 1] ) """ return MatrixGroup([matrix(Zmod(self.level()), 2, 2, 1)])
def matrix_group(self): """ Return the matrix group corresponding to ``self``. EXAMPLES:: sage: C = ColoredPermutations(4, 3) sage: C.matrix_group() Matrix group over Cyclotomic Field of order 4 and degree 2 with 3 generators ( [0 1 0] [1 0 0] [ 1 0 0] [1 0 0] [0 0 1] [ 0 1 0] [0 0 1], [0 1 0], [ 0 0 zeta4] ) """ from sage.groups.matrix_gps.finitely_generated import MatrixGroup return MatrixGroup([g.to_matrix() for g in self.gens()])
def automorphism_group(self): """ Return the group of automorphisms of the quadratic form. OUTPUT: a :class:`MatrixGroup` EXAMPLES:: sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1]) sage: Q.automorphism_group() Matrix group over Rational Field with 3 generators ( [-1 0 0] [0 0 1] [ 0 0 1] [ 0 -1 0] [0 1 0] [-1 0 0] [ 0 0 -1], [1 0 0], [ 0 1 0] ) :: sage: DiagonalQuadraticForm(ZZ, [1,3,5,7]).automorphism_group() Matrix group over Rational Field with 4 generators ( [-1 0 0 0] [ 1 0 0 0] [ 1 0 0 0] [ 1 0 0 0] [ 0 -1 0 0] [ 0 -1 0 0] [ 0 1 0 0] [ 0 1 0 0] [ 0 0 -1 0] [ 0 0 1 0] [ 0 0 -1 0] [ 0 0 1 0] [ 0 0 0 -1], [ 0 0 0 1], [ 0 0 0 1], [ 0 0 0 -1] ) The smallest possible automorphism group has order two, since we can always change all signs:: sage: Q = QuadraticForm(ZZ, 3, [2, 1, 2, 2, 1, 3]) sage: Q.automorphism_group() Matrix group over Rational Field with 1 generators ( [-1 0 0] [ 0 -1 0] [ 0 0 -1] ) """ self._compute_automorphisms() from sage.matrix.matrix_space import MatrixSpace from sage.groups.matrix_gps.finitely_generated import MatrixGroup MS = MatrixSpace(self.base_ring().fraction_field(), self.dim(), self.dim()) gens = [MS(x.sage()) for x in self.__automorphisms_pari] return MatrixGroup(gens)
def subgroup(self, generators, check=True): """ Return the subgroup generated by the given generators. INPUT: - ``generators`` -- a list/tuple/iterable of group elements of self - ``check`` -- boolean (optional, default: ``True``). Whether to check that each matrix is invertible. OUTPUT: The subgroup generated by ``generators`` as an instance of FinitelyGeneratedMatrixGroup_gap EXAMPLES:: sage: UCF = UniversalCyclotomicField() sage: G = GL(3, UCF) sage: e3 = UCF.gen(3); e5 =UCF.gen(5) sage: m = matrix(UCF, 3,3, [[e3, 1, 0], [0, e5, 7],[4, 3, 2]]) sage: S = G.subgroup([m]); S Subgroup with 1 generators ( [E(3) 1 0] [ 0 E(5) 7] [ 4 3 2] ) of General Linear Group of degree 3 over Universal Cyclotomic Field sage: CF3 = CyclotomicField(3) sage: G = GL(3, CF3) sage: e3 = CF3.gen() sage: m = matrix(CF3, 3,3, [[e3, 1, 0], [0, ~e3, 7],[4, 3, 2]]) sage: S = G.subgroup([m]); S Subgroup with 1 generators ( [ zeta3 1 0] [ 0 -zeta3 - 1 7] [ 4 3 2] ) of General Linear Group of degree 3 over Cyclotomic Field of order 3 and degree 2 TESTS:: sage: TestSuite(G).run() sage: TestSuite(S).run() sage: W = CoxeterGroup(['I',7]) sage: s = W.simple_reflections() sage: G = W.subgroup([s[1]]) sage: G.category() Category of finite groups sage: W = WeylGroup(['A',2]) sage: s = W.simple_reflections() sage: G = W.subgroup([s[1]]) sage: G.category() Category of finite groups """ try: test = self.is_finite() except NotImplementedError: test = self in Groups().Finite() cat = Groups().Finite() if test else Groups() # this method enlarges the method with same name of # ParentLibGAP to cases where the ambient group is not # inherited from ParentLibGAP. if isinstance(self, ParentLibGAP): return ParentLibGAP.subgroup(self, generators) for g in generators: if g not in self: raise ValueError("generator %s is not in the group" % (g)) from sage.groups.matrix_gps.finitely_generated import MatrixGroup subgroup = MatrixGroup(generators, check=check, category=cat) subgroup._ambient = self return subgroup