Mix-in Class for GAP-based Groups#

This class adds access to GAP functionality to groups such that parent and element have a gap() method that returns a GAP object for the parent/element.

If your group implementation uses libgap, then you should add GroupMixinLibGAP as the first class that you are deriving from. This ensures that it properly overrides any default methods that just raise NotImplementedError.

class sage.groups.libgap_mixin.GroupMixinLibGAP#

Bases: object

cardinality()#

Implements EnumeratedSets.ParentMethods.cardinality().

EXAMPLES:

sage: G = Sp(4,GF(3))
sage: G.cardinality()
51840

sage: G = SL(4,GF(3))
sage: G.cardinality()
12130560

sage: F = GF(5); MS = MatrixSpace(F,2,2)
sage: gens = [MS([[1,2],[-1,1]]),MS([[1,1],[0,1]])]
sage: G = MatrixGroup(gens)
sage: G.cardinality()
480

sage: G = MatrixGroup([matrix(ZZ,2,[1,1,0,1])])
sage: G.cardinality()
+Infinity

sage: G = Sp(4,GF(3))
sage: G.cardinality()
51840

sage: G = SL(4,GF(3))
sage: G.cardinality()
12130560

sage: F = GF(5); MS = MatrixSpace(F,2,2)
sage: gens = [MS([[1,2],[-1,1]]),MS([[1,1],[0,1]])]
sage: G = MatrixGroup(gens)
sage: G.cardinality()
480

sage: G = MatrixGroup([matrix(ZZ,2,[1,1,0,1])])
sage: G.cardinality()
+Infinity
center()#

Return the center of this group as a subgroup.

OUTPUT:

The center as a subgroup.

EXAMPLES:

sage: G = SU(3, GF(2))                                                      # needs sage.rings.finite_rings
sage: G.center()                                                            # needs sage.rings.finite_rings
Subgroup with 1 generators (
[a 0 0]
[0 a 0]
[0 0 a]
) of Special Unitary Group of degree 3 over Finite Field in a of size 2^2
sage: GL(2, GF(3)).center()
Subgroup with 1 generators (
[2 0]
[0 2]
) of General Linear Group of degree 2 over Finite Field of size 3
sage: GL(3, GF(3)).center()
Subgroup with 1 generators (
[2 0 0]
[0 2 0]
[0 0 2]
) of General Linear Group of degree 3 over Finite Field of size 3
sage: GU(3, GF(2)).center()                                                 # needs sage.rings.finite_rings
Subgroup with 1 generators (
[a + 1     0     0]
[    0 a + 1     0]
[    0     0 a + 1]
) of General Unitary Group of degree 3 over Finite Field in a of size 2^2

sage: A = Matrix(FiniteField(5), [[2,0,0], [0,3,0], [0,0,1]])
sage: B = Matrix(FiniteField(5), [[1,0,0], [0,1,0], [0,1,1]])
sage: MatrixGroup([A,B]).center()
Subgroup with 1 generators (
[1 0 0]
[0 1 0]
[0 0 1]
) of Matrix group over Finite Field of size 5 with 2 generators (
[2 0 0]  [1 0 0]
[0 3 0]  [0 1 0]
[0 0 1], [0 1 1]
)

sage: GL = groups.matrix.GL(3, ZZ)
sage: GL.center()
Traceback (most recent call last):
...
NotImplementedError: group must be finite
centralizer(g)#

Return the centralizer of g in self.

EXAMPLES:

sage: G = groups.matrix.GL(2, 3)
sage: g = G([[1,1], [1,0]])
sage: C = G.centralizer(g); C
Subgroup with 3 generators (
[1 1]  [2 0]  [2 1]
[1 0], [0 2], [1 1]
) of General Linear Group of degree 2 over Finite Field of size 3
sage: C.order()
8

sage: S = G.subgroup([G([[2,0],[0,2]]), G([[0,1],[2,0]])]); S
Subgroup with 2 generators (
[2 0]  [0 1]
[0 2], [2 0]
) of General Linear Group of degree 2 over Finite Field of size 3
sage: G.centralizer(S)
Subgroup with 3 generators (
[2 0]  [0 1]  [2 2]
[0 2], [2 0], [1 2]
) of General Linear Group of degree 2 over Finite Field of size 3
sage: G = GL(3,2)
sage: all(G.order() == G.centralizer(x).order() * G.conjugacy_class(x).cardinality()
....:     for x in G)
True
sage: H = groups.matrix.Heisenberg(2)
sage: H.centralizer(H.an_element())
Traceback (most recent call last):
...
NotImplementedError: group must be finite
character(values)#

Return a group character from values, where values is a list of the values of the character evaluated on the conjugacy classes.

INPUT:

  • values – a list of values of the character

OUTPUT: a group character

EXAMPLES:

sage: G = MatrixGroup(AlternatingGroup(4))
sage: G.character([1]*len(G.conjugacy_classes_representatives()))           # needs sage.rings.number_field
Character of Matrix group over Integer Ring with 12 generators
sage: G = GL(2,ZZ)
sage: G.character([1,1,1,1])
Traceback (most recent call last):
...
NotImplementedError: only implemented for finite groups
character_table()#

Return the matrix of values of the irreducible characters of this group \(G\) at its conjugacy classes.

The columns represent the conjugacy classes of \(G\) and the rows represent the different irreducible characters in the ordering given by GAP.

OUTPUT: a matrix defined over a cyclotomic field

EXAMPLES:

sage: MatrixGroup(SymmetricGroup(2)).character_table()                      # needs sage.rings.number_field
[ 1 -1]
[ 1  1]
sage: MatrixGroup(SymmetricGroup(3)).character_table()                      # needs sage.rings.number_field
[ 1  1 -1]
[ 2 -1  0]
[ 1  1  1]
sage: MatrixGroup(SymmetricGroup(5)).character_table()  # long time
[ 1 -1 -1  1 -1  1  1]
[ 4  0  1 -1 -2  1  0]
[ 5  1 -1  0 -1 -1  1]
[ 6  0  0  1  0  0 -2]
[ 5 -1  1  0  1 -1  1]
[ 4  0 -1 -1  2  1  0]
[ 1  1  1  1  1  1  1]
class_function(values)#

Return the class function with given values.

INPUT:

  • values – list/tuple/iterable of numbers. The values of the class function on the conjugacy classes, in that order.

EXAMPLES:

sage: G = GL(2,GF(3))
sage: chi = G.class_function(range(8))                                      # needs sage.rings.number_field
sage: list(chi)                                                             # needs sage.rings.number_field
[0, 1, 2, 3, 4, 5, 6, 7]
conjugacy_class(g)#

Return the conjugacy class of g.

OUTPUT:

The conjugacy class of g in the group self. If self is the group denoted by \(G\), this method computes the set \(\{x^{-1}gx\ \vert\ x\in G\}\).

EXAMPLES:

sage: G = SL(2, QQ)
sage: g = G([[1,1],[0,1]])
sage: G.conjugacy_class(g)
Conjugacy class of [1 1]
[0 1] in Special Linear Group of degree 2 over Rational Field
conjugacy_classes()#

Return a list with all the conjugacy classes of self.

EXAMPLES:

sage: G = SL(2, GF(2))
sage: G.conjugacy_classes()
(Conjugacy class of [1 0]
 [0 1] in Special Linear Group of degree 2 over Finite Field of size 2,
 Conjugacy class of [0 1]
 [1 0] in Special Linear Group of degree 2 over Finite Field of size 2,
 Conjugacy class of [0 1]
 [1 1] in Special Linear Group of degree 2 over Finite Field of size 2)
sage: GL(2,ZZ).conjugacy_classes()
Traceback (most recent call last):
...
NotImplementedError: only implemented for finite groups
conjugacy_classes_representatives()#

Return a set of representatives for each of the conjugacy classes of the group.

EXAMPLES:

sage: G = SU(3,GF(2))                                                       # needs sage.rings.finite_rings
sage: len(G.conjugacy_classes_representatives())                            # needs sage.rings.finite_rings
16

sage: G = GL(2,GF(3))
sage: G.conjugacy_classes_representatives()
(
[1 0]  [0 2]  [2 0]  [0 2]  [0 2]  [0 1]  [0 1]  [2 0]
[0 1], [1 1], [0 2], [1 2], [1 0], [1 2], [1 1], [0 1]
)

sage: len(GU(2,GF(5)).conjugacy_classes_representatives())                  # needs sage.rings.finite_rings
36
sage: GL(2,ZZ).conjugacy_classes_representatives()
Traceback (most recent call last):
...
NotImplementedError: only implemented for finite groups
conjugacy_classes_subgroups()#

Return a complete list of representatives of conjugacy classes of subgroups in self.

The ordering is that given by GAP.

EXAMPLES:

sage: G = groups.matrix.GL(2,2)
sage: G.conjugacy_classes_subgroups()
[Subgroup with 0 generators ()
   of General Linear Group of degree 2 over Finite Field of size 2,
 Subgroup with 1 generators (
 [1 1]
 [0 1]
 ) of General Linear Group of degree 2 over Finite Field of size 2,
 Subgroup with 1 generators (
 [0 1]
 [1 1]
 ) of General Linear Group of degree 2 over Finite Field of size 2,
 Subgroup with 2 generators (
 [0 1]  [1 1]
 [1 1], [0 1]
 ) of General Linear Group of degree 2 over Finite Field of size 2]

sage: H = groups.matrix.Heisenberg(2)
sage: H.conjugacy_classes_subgroups()
Traceback (most recent call last):
...
NotImplementedError: group must be finite
exponent()#

Computes the exponent of the group.

The exponent \(e\) of a group \(G\) is the LCM of the orders of its elements, that is, \(e\) is the smallest integer such that \(g^e = 1\) for all \(g \in G\).

EXAMPLES:

sage: G = groups.matrix.GL(2, 3)
sage: G.exponent()
24

sage: H = groups.matrix.Heisenberg(2)
sage: H.exponent()
Traceback (most recent call last):
...
NotImplementedError: group must be finite
group_id()#

Return the ID code of self, which is a list of two integers.

It is a unique identified assigned by GAP for groups in the SmallGroup library.

EXAMPLES:

sage: PGL(2,3).group_id()
[24, 12]
sage: SymmetricGroup(4).group_id()
[24, 12]

sage: G = groups.matrix.GL(2, 2)
sage: G.group_id()
[6, 1]
sage: G = groups.matrix.GL(2, 3)
sage: G.id()
[48, 29]

sage: G = groups.matrix.GL(2, ZZ)
sage: G.group_id()
Traceback (most recent call last):
...
GAPError: Error, the group identification for groups of size infinity is not available
id()#

Return the ID code of self, which is a list of two integers.

It is a unique identified assigned by GAP for groups in the SmallGroup library.

EXAMPLES:

sage: PGL(2,3).group_id()
[24, 12]
sage: SymmetricGroup(4).group_id()
[24, 12]

sage: G = groups.matrix.GL(2, 2)
sage: G.group_id()
[6, 1]
sage: G = groups.matrix.GL(2, 3)
sage: G.id()
[48, 29]

sage: G = groups.matrix.GL(2, ZZ)
sage: G.group_id()
Traceback (most recent call last):
...
GAPError: Error, the group identification for groups of size infinity is not available
intersection(other)#

Return the intersection of two groups (if it makes sense) as a subgroup of the first group.

EXAMPLES:

sage: A = Matrix([(0, 1/2, 0), (2, 0, 0), (0, 0, 1)])
sage: B = Matrix([(0, 1/2, 0), (-2, -1, 2), (0, 0, 1)])
sage: G = MatrixGroup([A,B])
sage: len(G)  # isomorphic to S_3
6
sage: G.intersection(GL(3,ZZ))
Subgroup with 1 generators (
[ 1  0  0]
[-2 -1  2]
[ 0  0  1]
) of Matrix group over Rational Field with 2 generators (
  [  0 1/2   0]  [  0 1/2   0]
  [  2   0   0]  [ -2  -1   2]
  [  0   0   1], [  0   0   1]
  )
sage: GL(3,ZZ).intersection(G)
Subgroup with 1 generators (
[ 1  0  0]
[-2 -1  2]
[ 0  0  1]
) of General Linear Group of degree 3 over Integer Ring
sage: G.intersection(SL(3,ZZ))
Subgroup with 0 generators ()
  of Matrix group over Rational Field with 2 generators (
  [  0 1/2   0]  [  0 1/2   0]
  [  2   0   0]  [ -2  -1   2]
  [  0   0   1], [  0   0   1]
  )
irreducible_characters()#

Return the irreducible characters of the group.

OUTPUT:

A tuple containing all irreducible characters.

EXAMPLES:

sage: G = GL(2,2)
sage: G.irreducible_characters()                                            # needs sage.rings.number_field
(Character of General Linear Group of degree 2 over Finite Field of size 2,
 Character of General Linear Group of degree 2 over Finite Field of size 2,
 Character of General Linear Group of degree 2 over Finite Field of size 2)
sage: GL(2,ZZ).irreducible_characters()
Traceback (most recent call last):
...
NotImplementedError: only implemented for finite groups
is_abelian()#

Return whether the group is Abelian.

OUTPUT:

Boolean. True if this group is an Abelian group and False otherwise.

EXAMPLES:

sage: from sage.groups.libgap_group import GroupLibGAP
sage: GroupLibGAP(libgap.CyclicGroup(12)).is_abelian()
True
sage: GroupLibGAP(libgap.SymmetricGroup(12)).is_abelian()
False

sage: SL(1, 17).is_abelian()
True
sage: SL(2, 17).is_abelian()
False
is_finite()#

Test whether the matrix group is finite.

OUTPUT:

Boolean.

EXAMPLES:

sage: G = GL(2,GF(3))
sage: G.is_finite()
True
sage: SL(2,ZZ).is_finite()
False
is_isomorphic(H)#

Test whether self and H are isomorphic groups.

INPUT:

  • H – a group.

OUTPUT:

Boolean.

EXAMPLES:

sage: m1 = matrix(GF(3), [[1,1],[0,1]])
sage: m2 = matrix(GF(3), [[1,2],[0,1]])
sage: F = MatrixGroup(m1)
sage: G = MatrixGroup(m1, m2)
sage: H = MatrixGroup(m2)
sage: F.is_isomorphic(G)
True
sage: G.is_isomorphic(H)
True
sage: F.is_isomorphic(H)
True
sage: F == G, G == H, F == H
(False, False, False)
is_nilpotent()#

Return whether this group is nilpotent.

EXAMPLES:

sage: from sage.groups.libgap_group import GroupLibGAP
sage: GroupLibGAP(libgap.AlternatingGroup(3)).is_nilpotent()
True
sage: GroupLibGAP(libgap.SymmetricGroup(3)).is_nilpotent()
False
is_p_group()#

Return whether this group is a p-group.

EXAMPLES:

sage: from sage.groups.libgap_group import GroupLibGAP
sage: GroupLibGAP(libgap.CyclicGroup(9)).is_p_group()
True
sage: GroupLibGAP(libgap.CyclicGroup(10)).is_p_group()
False
is_perfect()#

Return whether this group is perfect.

EXAMPLES:

sage: from sage.groups.libgap_group import GroupLibGAP
sage: GroupLibGAP(libgap.SymmetricGroup(5)).is_perfect()
False
sage: GroupLibGAP(libgap.AlternatingGroup(5)).is_perfect()
True

sage: SL(3,3).is_perfect()
True
is_polycyclic()#

Return whether this group is polycyclic.

EXAMPLES:

sage: from sage.groups.libgap_group import GroupLibGAP
sage: GroupLibGAP(libgap.AlternatingGroup(4)).is_polycyclic()
True
sage: GroupLibGAP(libgap.AlternatingGroup(5)).is_solvable()
False
is_simple()#

Return whether this group is simple.

EXAMPLES:

sage: from sage.groups.libgap_group import GroupLibGAP
sage: GroupLibGAP(libgap.SL(2,3)).is_simple()
False
sage: GroupLibGAP(libgap.SL(3,3)).is_simple()
True

sage: SL(3,3).is_simple()
True
is_solvable()#

Return whether this group is solvable.

EXAMPLES:

sage: from sage.groups.libgap_group import GroupLibGAP
sage: GroupLibGAP(libgap.SymmetricGroup(4)).is_solvable()
True
sage: GroupLibGAP(libgap.SymmetricGroup(5)).is_solvable()
False
is_supersolvable()#

Return whether this group is supersolvable.

EXAMPLES:

sage: from sage.groups.libgap_group import GroupLibGAP
sage: GroupLibGAP(libgap.SymmetricGroup(3)).is_supersolvable()
True
sage: GroupLibGAP(libgap.SymmetricGroup(4)).is_supersolvable()
False
list()#

List all elements of this group.

OUTPUT:

A tuple containing all group elements in a random but fixed order.

EXAMPLES:

sage: F = GF(3)
sage: gens = [matrix(F,2, [1,0,-1,1]), matrix(F, 2, [1,1,0,1])]
sage: G = MatrixGroup(gens)
sage: G.cardinality()
24
sage: v = G.list()
sage: len(v)
24
sage: v[:5]
(
[1 0]  [2 0]  [0 1]  [0 2]  [1 2]
[0 1], [0 2], [2 0], [1 0], [2 2]
)

sage: all(g in G for g in G.list())
True

An example over a ring (see github issue #5241):

sage: M1 = matrix(ZZ,2,[[-1,0],[0,1]])
sage: M2 = matrix(ZZ,2,[[1,0],[0,-1]])
sage: M3 = matrix(ZZ,2,[[-1,0],[0,-1]])
sage: MG = MatrixGroup([M1, M2, M3])
sage: MG.list()
(
[1 0]  [ 1  0]  [-1  0]  [-1  0]
[0 1], [ 0 -1], [ 0  1], [ 0 -1]
)
sage: MG.list()[1]
[ 1  0]
[ 0 -1]
sage: MG.list()[1].parent()
Matrix group over Integer Ring with 3 generators (
[-1  0]  [ 1  0]  [-1  0]
[ 0  1], [ 0 -1], [ 0 -1]
)

An example over a field (see github issue #10515):

sage: gens = [matrix(QQ,2,[1,0,0,1])]
sage: MatrixGroup(gens).list()
(
[1 0]
[0 1]
)

Another example over a ring (see github issue #9437):

sage: len(SL(2, Zmod(4)).list())
48

An error is raised if the group is not finite:

sage: GL(2,ZZ).list()
Traceback (most recent call last):
...
NotImplementedError: group must be finite
order()#

Implements EnumeratedSets.ParentMethods.cardinality().

EXAMPLES:

sage: G = Sp(4,GF(3))
sage: G.cardinality()
51840

sage: G = SL(4,GF(3))
sage: G.cardinality()
12130560

sage: F = GF(5); MS = MatrixSpace(F,2,2)
sage: gens = [MS([[1,2],[-1,1]]),MS([[1,1],[0,1]])]
sage: G = MatrixGroup(gens)
sage: G.cardinality()
480

sage: G = MatrixGroup([matrix(ZZ,2,[1,1,0,1])])
sage: G.cardinality()
+Infinity

sage: G = Sp(4,GF(3))
sage: G.cardinality()
51840

sage: G = SL(4,GF(3))
sage: G.cardinality()
12130560

sage: F = GF(5); MS = MatrixSpace(F,2,2)
sage: gens = [MS([[1,2],[-1,1]]),MS([[1,1],[0,1]])]
sage: G = MatrixGroup(gens)
sage: G.cardinality()
480

sage: G = MatrixGroup([matrix(ZZ,2,[1,1,0,1])])
sage: G.cardinality()
+Infinity
random_element()#

Return a random element of this group.

OUTPUT:

A group element.

EXAMPLES:

sage: G = Sp(4,GF(3))
sage: G.random_element()  # random
[2 1 1 1]
[1 0 2 1]
[0 1 1 0]
[1 0 0 1]
sage: G.random_element() in G
True

sage: F = GF(5); MS = MatrixSpace(F,2,2)
sage: gens = [MS([[1,2],[-1,1]]), MS([[1,1],[0,1]])]
sage: G = MatrixGroup(gens)
sage: G.random_element()  # random
[1 3]
[0 3]
sage: G.random_element() in G
True
subgroups()#

Return a list of all the subgroups of self.

OUTPUT:

Each possible subgroup of self is contained once in the returned list. The list is in order, according to the size of the subgroups, from the trivial subgroup with one element on through up to the whole group. Conjugacy classes of subgroups are contiguous in the list.

Warning

For even relatively small groups this method can take a very long time to execute, or create vast amounts of output. Likely both. Its purpose is instructional, as it can be useful for studying small groups.

For faster results, which still exhibit the structure of the possible subgroups, use conjugacy_classes_subgroups().

EXAMPLES:

sage: G = groups.matrix.GL(2, 2)
sage: G.subgroups()
[Subgroup with 0 generators ()
   of General Linear Group of degree 2 over Finite Field of size 2,
 Subgroup with 1 generators (
 [0 1]
 [1 0]
 ) of General Linear Group of degree 2 over Finite Field of size 2,
 Subgroup with 1 generators (
 [1 0]
 [1 1]
 ) of General Linear Group of degree 2 over Finite Field of size 2,
 Subgroup with 1 generators (
 [1 1]
 [0 1]
 ) of General Linear Group of degree 2 over Finite Field of size 2,
 Subgroup with 1 generators (
 [0 1]
 [1 1]
 ) of General Linear Group of degree 2 over Finite Field of size 2,
 Subgroup with 2 generators (
 [0 1]  [1 1]
 [1 1], [0 1]
 ) of General Linear Group of degree 2 over Finite Field of size 2]

sage: H = groups.matrix.Heisenberg(2)
sage: H.subgroups()
Traceback (most recent call last):
...
NotImplementedError: group must be finite
trivial_character()#

Return the trivial character of this group.

OUTPUT: a group character

EXAMPLES:

sage: MatrixGroup(SymmetricGroup(3)).trivial_character()                    # needs sage.rings.number_field
Character of Matrix group over Integer Ring with 6 generators
sage: GL(2,ZZ).trivial_character()
Traceback (most recent call last):
...
NotImplementedError: only implemented for finite groups