def __init__(self, n): """ Initialize ``self``. EXAMPLES:: sage: G = groups.matrix.BinaryDihedral(4) sage: TestSuite(G).run() """ self._n = n if n % 2 == 0: R = CyclotomicField(2 * n) zeta = R.gen() i = R.gen()**(n // 2) else: R = CyclotomicField(4 * n) zeta = R.gen()**2 i = R.gen()**n MS = MatrixSpace(R, 2) zero = R.zero() gens = [MS([zeta, zero, zero, ~zeta]), MS([zero, i, i, zero])] from sage.libs.gap.libgap import libgap gap_gens = [libgap(matrix_gen) for matrix_gen in gens] gap_group = libgap.Group(gap_gens) FinitelyGeneratedMatrixGroup_gap.__init__(self, ZZ(2), R, gap_group, category=Groups().Finite())
def __init__(self, domain, prefix): """ EXAMPLES:: sage: G = WeylGroup(['B',3]) sage: TestSuite(G).run() """ self._domain = domain if self.cartan_type().is_affine(): category = AffineWeylGroups() elif self.cartan_type().is_finite(): category = FiniteWeylGroups() else: category = WeylGroups() self.n = domain.dimension() # Really needed? self._prefix = prefix # FinitelyGeneratedMatrixGroup_gap takes plain matrices as input gens_matrix = [self.morphism_matrix(self.domain().simple_reflection(i)) for i in self.index_set()] from sage.libs.all import libgap libgap_group = libgap.Group(gens_matrix) degree = ZZ(self.domain().dimension()) ring = self.domain().base_ring() FinitelyGeneratedMatrixGroup_gap.__init__( self, degree, ring, libgap_group, category=category)
def __init__(self, domain, prefix): """ EXAMPLES:: sage: G = WeylGroup(['B',3]) sage: TestSuite(G).run() sage: cm = CartanMatrix([[2,-5,0],[-2,2,-1],[0,-1,2]]) sage: W = WeylGroup(cm) sage: TestSuite(W).run() # long time """ self._domain = domain if self.cartan_type().is_affine(): category = AffineWeylGroups() elif self.cartan_type().is_finite(): category = FiniteWeylGroups() else: category = WeylGroups() if self.cartan_type().is_irreducible(): category = category.Irreducible() self.n = domain.dimension() # Really needed? self._prefix = prefix # FinitelyGeneratedMatrixGroup_gap takes plain matrices as input gens_matrix = [self.morphism_matrix(self.domain().simple_reflection(i)) for i in self.index_set()] from sage.libs.all import libgap libgap_group = libgap.Group(gens_matrix) degree = ZZ(self.domain().dimension()) ring = self.domain().base_ring() FinitelyGeneratedMatrixGroup_gap.__init__( self, degree, ring, libgap_group, category=category)
def __init__(self, n=1, R=0): """ Initialize ``self``. EXAMPLES:: sage: H = groups.matrix.Heisenberg(n=2, R=5) sage: TestSuite(H).run() # long time sage: H = groups.matrix.Heisenberg(n=2, R=4) sage: TestSuite(H).run() # long time sage: H = groups.matrix.Heisenberg(n=3) sage: TestSuite(H).run(max_runs=30, skip="_test_elements") # long time sage: H = groups.matrix.Heisenberg(n=2, R=GF(4)) sage: TestSuite(H).run() # long time """ def elementary_matrix(i, j, val, MS): elm = copy(MS.one()) elm[i, j] = val elm.set_immutable() return elm self._n = n self._ring = R # We need the generators of the ring as a commutative additive group if self._ring is ZZ: ring_gens = [self._ring.one()] else: if self._ring.cardinality() == self._ring.characteristic(): ring_gens = [self._ring.one()] else: # This is overkill, but is the only way to ensure # we get all of the elements ring_gens = list(self._ring) dim = ZZ(n + 2) MS = MatrixSpace(self._ring, dim) gens_x = [ elementary_matrix(0, j, gen, MS) for j in range(1, dim - 1) for gen in ring_gens ] gens_y = [ elementary_matrix(i, dim - 1, gen, MS) for i in range(1, dim - 1) for gen in ring_gens ] gen_z = [elementary_matrix(0, dim - 1, gen, MS) for gen in ring_gens] gens = gens_x + gens_y + gen_z from sage.libs.gap.libgap import libgap gap_gens = [libgap(single_gen) for single_gen in gens] gap_group = libgap.Group(gap_gens) cat = Groups().FinitelyGenerated() if self._ring in Rings().Finite(): cat = cat.Finite() FinitelyGeneratedMatrixGroup_gap.__init__(self, ZZ(dim), self._ring, gap_group, category=cat)
def __init__(self, n): """ Initialize ``self``. EXAMPLES:: sage: G = groups.matrix.BinaryDihedral(4) sage: TestSuite(G).run() """ self._n = n if n % 2 == 0: R = CyclotomicField(2*n) zeta = R.gen() i = R.gen()**(n//2) else: R = CyclotomicField(4*n) zeta = R.gen()**2 i = R.gen()**n MS = MatrixSpace(R, 2) zero = R.zero() gens = [ MS([zeta, zero, zero, ~zeta]), MS([zero, i, i, zero]) ] from sage.libs.gap.libgap import libgap gap_gens = [libgap(matrix_gen) for matrix_gen in gens] gap_group = libgap.Group(gap_gens) FinitelyGeneratedMatrixGroup_gap.__init__(self, ZZ(2), R, gap_group, category=Groups().Finite())
def __init__(self, n=1, R=0): """ Initialize ``self``. EXAMPLES:: sage: H = groups.matrix.Heisenberg(n=2, R=5) sage: TestSuite(H).run() # long time sage: H = groups.matrix.Heisenberg(n=2, R=4) sage: TestSuite(H).run() # long time sage: H = groups.matrix.Heisenberg(n=3) sage: TestSuite(H).run(max_runs=30, skip="_test_elements") # long time sage: H = groups.matrix.Heisenberg(n=2, R=GF(4)) sage: TestSuite(H).run() # long time """ def elementary_matrix(i, j, val, MS): elm = copy(MS.one()) elm[i,j] = val elm.set_immutable() return elm self._n = n self._ring = R # We need the generators of the ring as a commutative additive group if self._ring is ZZ: ring_gens = [self._ring.one()] else: if self._ring.cardinality() == self._ring.characteristic(): ring_gens = [self._ring.one()] else: # This is overkill, but is the only way to ensure # we get all of the elements ring_gens = list(self._ring) dim = ZZ(n + 2) MS = MatrixSpace(self._ring, dim) gens_x = [elementary_matrix(0, j, gen, MS) for j in range(1, dim-1) for gen in ring_gens] gens_y = [elementary_matrix(i, dim-1, gen, MS) for i in range(1, dim-1) for gen in ring_gens] gen_z = [elementary_matrix(0, dim-1, gen, MS) for gen in ring_gens] gens = gens_x + gens_y + gen_z from sage.libs.gap.libgap import libgap gap_gens = [libgap(single_gen) for single_gen in gens] gap_group = libgap.Group(gap_gens) cat = Groups().FinitelyGenerated() if self._ring in Rings().Finite(): cat = cat.Finite() FinitelyGeneratedMatrixGroup_gap.__init__(self, ZZ(dim), self._ring, gap_group, category=cat)
def _subgroup_constructor(self, libgap_subgroup): """ Return a finitely generated subgroup. See :meth:`sage.groups.libgap_wrapper.ParentLibGAP._subgroup_constructor` for details. TESTS:: sage: SL2Z = SL(2,ZZ) sage: S, T = SL2Z.gens() sage: G = SL2Z.subgroup([T^2]); G # indirect doctest Matrix group over Integer Ring with 1 generators ( [1 2] [0 1] ) sage: G.ambient() is SL2Z True """ from sage.groups.matrix_gps.finitely_generated import FinitelyGeneratedMatrixGroup_gap return FinitelyGeneratedMatrixGroup_gap(self.degree(), self.base_ring(), libgap_subgroup, ambient=self)
def __init__(self, degree, base_ring, gens, invariant_bilinear_form, category=None, check=True, invariant_submodule=None, invariant_quotient_module=None): r""" Create this orthogonal group from the input. TESTS:: sage: from sage.groups.matrix_gps.isometries import GroupOfIsometries sage: bil = Matrix(ZZ,2,[3,2,2,3]) sage: gens = [-Matrix(ZZ,2,[0,1,1,0])] sage: cat = Groups().Finite() sage: O = GroupOfIsometries(2, ZZ, gens, bil, category=cat) sage: TestSuite(O).run() """ from copy import copy G = copy(invariant_bilinear_form) G.set_immutable() self._invariant_bilinear_form = G self._invariant_submodule = invariant_submodule self._invariant_quotient_module = invariant_quotient_module if check: I = invariant_submodule Q = invariant_quotient_module for f in gens: self._check_matrix(f) if (not I is None) and I * f != I: raise ValueError("the submodule is not preserved") if not Q is None and (Q.W() != Q.W() * f or Q.V() * f != Q.V()): raise ValueError("the quotient module is not preserved") if len(gens) == 0: # handle the trivial group gens = [G.parent().identity_matrix()] from sage.libs.gap.libgap import libgap gap_gens = [libgap(matrix_gen) for matrix_gen in gens] gap_group = libgap.Group(gap_gens) FinitelyGeneratedMatrixGroup_gap.__init__(self, degree, base_ring, gap_group, category=category)
def __init__(self, degree, base_ring, gens, invariant_bilinear_form, category=None, check=True, invariant_submodule=None, invariant_quotient_module=None): r""" Create this orthogonal group from the input. TESTS:: sage: from sage.groups.matrix_gps.isometries import GroupOfIsometries sage: bil = Matrix(ZZ,2,[3,2,2,3]) sage: gens = [-Matrix(ZZ,2,[0,1,1,0])] sage: cat = Groups().Finite() sage: O = GroupOfIsometries(2, ZZ, gens, bil, category=cat) sage: TestSuite(O).run() """ from copy import copy G = copy(invariant_bilinear_form) G.set_immutable() self._invariant_bilinear_form = G self._invariant_submodule = invariant_submodule self._invariant_quotient_module = invariant_quotient_module if check: I = invariant_submodule Q = invariant_quotient_module for f in gens: self._check_matrix(f) if (not I is None) and I*f != I: raise ValueError("the submodule is not preserved") if not Q is None and (Q.W() != Q.W()*f or Q.V()*f != Q.V()): raise ValueError("the quotient module is not preserved") if len(gens) == 0: # handle the trivial group gens = [G.parent().identity_matrix()] from sage.libs.gap.libgap import libgap gap_gens = [libgap(matrix_gen) for matrix_gen in gens] gap_group = libgap.Group(gap_gens) FinitelyGeneratedMatrixGroup_gap.__init__(self, degree, base_ring, gap_group, category=category)