Linear Groups#

EXAMPLES:

sage: GL(4, QQ)
General Linear Group of degree 4 over Rational Field
sage: GL(1, ZZ)
General Linear Group of degree 1 over Integer Ring
sage: GL(100, RR)
General Linear Group of degree 100 over Real Field with 53 bits of precision
sage: GL(3, GF(49,'a'))                                                             # needs sage.rings.finite_rings
General Linear Group of degree 3 over Finite Field in a of size 7^2

sage: SL(2, ZZ)
Special Linear Group of degree 2 over Integer Ring
sage: G = SL(2, GF(3)); G
Special Linear Group of degree 2 over Finite Field of size 3

sage: # needs sage.libs.gap
sage: G.is_finite()
True
sage: G.conjugacy_classes_representatives()
(
[1 0]  [0 2]  [0 1]  [2 0]  [0 2]  [0 1]  [0 2]
[0 1], [1 1], [2 1], [0 2], [1 2], [2 2], [1 0]
)
sage: G = SL(6, GF(5))
sage: G.gens()
(
[2 0 0 0 0 0]  [4 0 0 0 0 1]
[0 3 0 0 0 0]  [4 0 0 0 0 0]
[0 0 1 0 0 0]  [0 4 0 0 0 0]
[0 0 0 1 0 0]  [0 0 4 0 0 0]
[0 0 0 0 1 0]  [0 0 0 4 0 0]
[0 0 0 0 0 1], [0 0 0 0 4 0]
)
>>> from sage.all import *
>>> GL(Integer(4), QQ)
General Linear Group of degree 4 over Rational Field
>>> GL(Integer(1), ZZ)
General Linear Group of degree 1 over Integer Ring
>>> GL(Integer(100), RR)
General Linear Group of degree 100 over Real Field with 53 bits of precision
>>> GL(Integer(3), GF(Integer(49),'a'))                                                             # needs sage.rings.finite_rings
General Linear Group of degree 3 over Finite Field in a of size 7^2

>>> SL(Integer(2), ZZ)
Special Linear Group of degree 2 over Integer Ring
>>> G = SL(Integer(2), GF(Integer(3))); G
Special Linear Group of degree 2 over Finite Field of size 3

>>> # needs sage.libs.gap
>>> G.is_finite()
True
>>> G.conjugacy_classes_representatives()
(
[1 0]  [0 2]  [0 1]  [2 0]  [0 2]  [0 1]  [0 2]
[0 1], [1 1], [2 1], [0 2], [1 2], [2 2], [1 0]
)
>>> G = SL(Integer(6), GF(Integer(5)))
>>> G.gens()
(
[2 0 0 0 0 0]  [4 0 0 0 0 1]
[0 3 0 0 0 0]  [4 0 0 0 0 0]
[0 0 1 0 0 0]  [0 4 0 0 0 0]
[0 0 0 1 0 0]  [0 0 4 0 0 0]
[0 0 0 0 1 0]  [0 0 0 4 0 0]
[0 0 0 0 0 1], [0 0 0 0 4 0]
)

AUTHORS:

  • William Stein: initial version

  • David Joyner: degree, base_ring, random, order methods; examples

  • David Joyner (2006-05): added center, more examples, renamed random attributes, bug fixes.

  • William Stein (2006-12): total rewrite

  • Volker Braun (2013-1) port to new Parent, libGAP, extreme refactoring.

REFERENCES: See [KL1990] and [Car1972].

sage.groups.matrix_gps.linear.GL(n, R, var='a')[source]#

Return the general linear group.

The general linear group \(GL( d, R )\) consists of all \(d \times d\) matrices that are invertible over the ring \(R\).

Note

This group is also available via groups.matrix.GL().

INPUT:

  • n – a positive integer.

  • R – ring or an integer. If an integer is specified, the corresponding finite field is used.

  • var – variable used to represent generator of the finite field, if needed.

EXAMPLES:

sage: G = GL(6, GF(5))
sage: G.base_ring()
Finite Field of size 5
sage: G.category()
Category of finite groups

sage: # needs sage.libs.gap
sage: G.order()
11064475422000000000000000
sage: TestSuite(G).run()

sage: G = GL(6, QQ)
sage: G.category()
Category of infinite groups

sage: # needs sage.libs.gap
sage: TestSuite(G).run()
>>> from sage.all import *
>>> G = GL(Integer(6), GF(Integer(5)))
>>> G.base_ring()
Finite Field of size 5
>>> G.category()
Category of finite groups

>>> # needs sage.libs.gap
>>> G.order()
11064475422000000000000000
>>> TestSuite(G).run()

>>> G = GL(Integer(6), QQ)
>>> G.category()
Category of infinite groups

>>> # needs sage.libs.gap
>>> TestSuite(G).run()

Here is the Cayley graph of (relatively small) finite General Linear Group:

sage: # needs sage.graphs sage.libs.gap
sage: g = GL(2,3)
sage: d = g.cayley_graph(); d
Digraph on 48 vertices
sage: d.plot(color_by_label=True, vertex_size=0.03,     # long time             # needs sage.plot
....:        vertex_labels=False)
Graphics object consisting of 144 graphics primitives
sage: d.plot3d(color_by_label=True)                     # long time             # needs sage.plot
Graphics3d Object
>>> from sage.all import *
>>> # needs sage.graphs sage.libs.gap
>>> g = GL(Integer(2),Integer(3))
>>> d = g.cayley_graph(); d
Digraph on 48 vertices
>>> d.plot(color_by_label=True, vertex_size=RealNumber('0.03'),     # long time             # needs sage.plot
...        vertex_labels=False)
Graphics object consisting of 144 graphics primitives
>>> d.plot3d(color_by_label=True)                     # long time             # needs sage.plot
Graphics3d Object
sage: # needs sage.libs.gap
sage: F = GF(3); MS = MatrixSpace(F, 2, 2)
sage: gens = [MS([[2,0], [0,1]]), MS([[2,1], [2,0]])]
sage: G = MatrixGroup(gens)
sage: G.order()
48
sage: G.cardinality()
48
sage: H = GL(2,F)
sage: H.order()
48
sage: H == G
True
sage: H.gens() == G.gens()
True
sage: H.as_matrix_group() == H
True
sage: H.gens()
(
[2 0]  [2 1]
[0 1], [2 0]
)
>>> from sage.all import *
>>> # needs sage.libs.gap
>>> F = GF(Integer(3)); MS = MatrixSpace(F, Integer(2), Integer(2))
>>> gens = [MS([[Integer(2),Integer(0)], [Integer(0),Integer(1)]]), MS([[Integer(2),Integer(1)], [Integer(2),Integer(0)]])]
>>> G = MatrixGroup(gens)
>>> G.order()
48
>>> G.cardinality()
48
>>> H = GL(Integer(2),F)
>>> H.order()
48
>>> H == G
True
>>> H.gens() == G.gens()
True
>>> H.as_matrix_group() == H
True
>>> H.gens()
(
[2 0]  [2 1]
[0 1], [2 0]
)
class sage.groups.matrix_gps.linear.LinearMatrixGroup_generic(degree, base_ring, special, sage_name, latex_string, category=None, invariant_form=None)[source]#

Bases: NamedMatrixGroup_generic

cardinality()[source]#

Return the order of self.

EXAMPLES:

sage: G = SL(3, GF(5))
sage: G.order()
372000
>>> from sage.all import *
>>> G = SL(Integer(3), GF(Integer(5)))
>>> G.order()
372000

The order computation also works over the base rings \(\ZZ/n\ZZ\):

sage: GL(4, Integers(15)).order()
2815842631680000000

sage: SL(4, Integers(15)).order()
351980328960000000

sage: G = GL(2, Integers(6))
sage: G.order() == len(list(G))
True

sage: H = SL(2, Integers(6))
sage: H.order() == len(list(H))
True
>>> from sage.all import *
>>> GL(Integer(4), Integers(Integer(15))).order()
2815842631680000000

>>> SL(Integer(4), Integers(Integer(15))).order()
351980328960000000

>>> G = GL(Integer(2), Integers(Integer(6)))
>>> G.order() == len(list(G))
True

>>> H = SL(Integer(2), Integers(Integer(6)))
>>> H.order() == len(list(H))
True

Arbitrary base rings are currently not fully supported:

sage: R.<x> = PolynomialRing(GF(7))
sage: S = R.quotient(x^2 + 5)
sage: GL(2, S).order()
Traceback (most recent call last):
...
NotImplementedError: order computation of linear groups not fully supported for arbitrary base rings
>>> from sage.all import *
>>> R = PolynomialRing(GF(Integer(7)), names=('x',)); (x,) = R._first_ngens(1)
>>> S = R.quotient(x**Integer(2) + Integer(5))
>>> GL(Integer(2), S).order()
Traceback (most recent call last):
...
NotImplementedError: order computation of linear groups not fully supported for arbitrary base rings
order()[source]#

Return the order of self.

EXAMPLES:

sage: G = SL(3, GF(5))
sage: G.order()
372000
>>> from sage.all import *
>>> G = SL(Integer(3), GF(Integer(5)))
>>> G.order()
372000

The order computation also works over the base rings \(\ZZ/n\ZZ\):

sage: GL(4, Integers(15)).order()
2815842631680000000

sage: SL(4, Integers(15)).order()
351980328960000000

sage: G = GL(2, Integers(6))
sage: G.order() == len(list(G))
True

sage: H = SL(2, Integers(6))
sage: H.order() == len(list(H))
True
>>> from sage.all import *
>>> GL(Integer(4), Integers(Integer(15))).order()
2815842631680000000

>>> SL(Integer(4), Integers(Integer(15))).order()
351980328960000000

>>> G = GL(Integer(2), Integers(Integer(6)))
>>> G.order() == len(list(G))
True

>>> H = SL(Integer(2), Integers(Integer(6)))
>>> H.order() == len(list(H))
True

Arbitrary base rings are currently not fully supported:

sage: R.<x> = PolynomialRing(GF(7))
sage: S = R.quotient(x^2 + 5)
sage: GL(2, S).order()
Traceback (most recent call last):
...
NotImplementedError: order computation of linear groups not fully supported for arbitrary base rings
>>> from sage.all import *
>>> R = PolynomialRing(GF(Integer(7)), names=('x',)); (x,) = R._first_ngens(1)
>>> S = R.quotient(x**Integer(2) + Integer(5))
>>> GL(Integer(2), S).order()
Traceback (most recent call last):
...
NotImplementedError: order computation of linear groups not fully supported for arbitrary base rings
sage.groups.matrix_gps.linear.SL(n, R, var='a')[source]#

Return the special linear group.

The special linear group \(SL( d, R )\) consists of all \(d \times d\) matrices that are invertible over the ring \(R\) with determinant one.

Note

This group is also available via groups.matrix.SL().

INPUT:

  • n – positive integer

  • R – ring or integer; if an integer is specified, the corresponding finite field is used

  • var – variable used to represent generator of the finite field, if needed

EXAMPLES:

sage: SL(3, GF(2))
Special Linear Group of degree 3 over Finite Field of size 2
sage: G = SL(15, GF(7)); G
Special Linear Group of degree 15 over Finite Field of size 7
sage: G.category()
Category of finite groups

sage: # needs sage.libs.gap
sage: G.order()
1956712595698146962015219062429586341124018007182049478916067369638713066737882363393519966343657677430907011270206265834819092046250232049187967718149558134226774650845658791865745408000000
sage: len(G.gens())
2

sage: G = SL(2, ZZ); G
Special Linear Group of degree 2 over Integer Ring
sage: G.category()
Category of infinite groups
sage: G.gens()
(
[ 0  1]  [1 1]
[-1  0], [0 1]
)
>>> from sage.all import *
>>> SL(Integer(3), GF(Integer(2)))
Special Linear Group of degree 3 over Finite Field of size 2
>>> G = SL(Integer(15), GF(Integer(7))); G
Special Linear Group of degree 15 over Finite Field of size 7
>>> G.category()
Category of finite groups

>>> # needs sage.libs.gap
>>> G.order()
1956712595698146962015219062429586341124018007182049478916067369638713066737882363393519966343657677430907011270206265834819092046250232049187967718149558134226774650845658791865745408000000
>>> len(G.gens())
2

>>> G = SL(Integer(2), ZZ); G
Special Linear Group of degree 2 over Integer Ring
>>> G.category()
Category of infinite groups
>>> G.gens()
(
[ 0  1]  [1 1]
[-1  0], [0 1]
)

Next we compute generators for \(\mathrm{SL}_3(\ZZ)\)

sage: G = SL(3, ZZ); G
Special Linear Group of degree 3 over Integer Ring

sage: # needs sage.libs.gap
sage: G.gens()
(
[0 1 0]  [ 0  1  0]  [1 1 0]
[0 0 1]  [-1  0  0]  [0 1 0]
[1 0 0], [ 0  0  1], [0 0 1]
)
sage: TestSuite(G).run()
>>> from sage.all import *
>>> G = SL(Integer(3), ZZ); G
Special Linear Group of degree 3 over Integer Ring

>>> # needs sage.libs.gap
>>> G.gens()
(
[0 1 0]  [ 0  1  0]  [1 1 0]
[0 0 1]  [-1  0  0]  [0 1 0]
[1 0 0], [ 0  0  1], [0 0 1]
)
>>> TestSuite(G).run()