4  O primeiro encontro com grupos

Nesta página, vamos ver como construir grupos em GAP e como fazer operações básicas com seus elementos.

4.1 Grupos disponíveis na biblioteca

GAP permite várias formas de definir grupos. O sistema já vem com algumas classes de grupos pré-definidas. Primeiro considere alguns exemplos usando os grupos GL e SL. Lembre que \[ \mbox{GL}(n,\mathbb F)=\{A\in M_{n\times n}(\mathbb F)\mid \det A\neq 0\} \] e \[ \mbox{SL}(n,\mathbb F)=\{A\in \mbox{GL}(n,\mathbb F)\mid \det A= 1\}. \] Quando \(\mathbb F\) é o corpo finito com \(q\) elementos, os grupos \(\mbox{GL}(n,\mathbb F)\) e \(\mbox{SL}(n,\mathbb F)\) são também escritos como \(\mbox{GL}(n,q)\) e \(\mbox{SL}(n,q)\). Para revisar corpos finitos (função GF) consulte Seção 2.4.

gap> G1 := GL( 3, 5 );
GL(3,5)
gap> G2 := SL( 3, 5 );
SL(3,5)
gap> Order( G1 );
1488000
gap> Order( G2 );
372000
gap> IsSubgroup( G1, G2 );
true
gap> IsNormal( G1, G2 );
true

Ora, considere as construções com SymmetricGroup e AlternatingGroup. Lembre que o grupo simétrico \(S_n\) é o grupo de todas as permutações do conjunto \(\{1,\ldots,n\}\) considerando com a operaçõo de composição. O grupo alternado \(A_n\) é o grupo das permutações pares.

gap> S6 := SymmetricGroup( 6 );
Sym( [ 1 .. 6 ] )
gap> A6 := AlternatingGroup( 6 );
Alt( [ 1 .. 6 ] )
gap> IsSubgroup( S6, A6 );
true
gap> IsNormal( S6, A6 );
true

Na biblioteca do GAP, tem uma base de dados com todos os grupos de ordem pequena. Estes grupos podem ser acessos usando a função SmallGroup( n, k ) que devolve o \(k\)-ésimo grupo de ordem \(n\) na biblioteca de GAP. Veja o seguinte exemplo.

gap> g := SmallGroup( 8, 3 );
<pc group of size 8 with 3 generators>
gap> StructureDescription( g );
"D8"

O grupo SmallGroup( 8, 3 ) é o grupo diedral de ordem 8.

Uma família de grupos pode ser construído também com a função AllSmallGroups. No seguinte exemplo, vamos construir todos os grupos nilpotentes de ordem entre \(10\) e \(20\).

gap> AllSmallGroups( Size, [10..20] , IsNilpotent, true  );
[ <pc group of size 10 with 2 generators>, 
  <pc group of size 11 with 1 generator>, 
  <pc group of size 12 with 3 generators>, 
  <pc group of size 12 with 3 generators>, 
  <pc group of size 13 with 1 generator>, 
  <pc group of size 14 with 2 generators>, 
  <pc group of size 15 with 2 generators>, 
  <pc group of size 16 with 4 generators>, 
  <pc group of size 16 with 4 generators>, 
  <pc group of size 16 with 4 generators>, 
  <pc group of size 16 with 4 generators>, 
  <pc group of size 16 with 4 generators>, 
  <pc group of size 16 with 4 generators>, 
  <pc group of size 16 with 4 generators>, 
  <pc group of size 16 with 4 generators>, 
  <pc group of size 16 with 4 generators>, 
  <pc group of size 16 with 4 generators>, 
  <pc group of size 16 with 4 generators>, 
  <pc group of size 16 with 4 generators>, 
  <pc group of size 16 with 4 generators>, 
  <pc group of size 16 with 4 generators>, 
  <pc group of size 17 with 1 generator>, 
  <pc group of size 18 with 3 generators>, 
  <pc group of size 18 with 3 generators>, 
  <pc group of size 19 with 1 generator>, 
  <pc group of size 20 with 3 generators>, 
  <pc group of size 20 with 3 generators> ]

4.2 Tarefa

  1. Construa os grupos \(\mbox{SL}(4,7)\) e \(\mbox{GL}(4,7)\) e calcule as suas ordens.
  2. Construa os grupos \(S_7\) e \(A_7\) e calcule as suas ordens.
  3. Construa a lista de todos os grupos de ordem entre \(55\) e \(65\).
  4. Ache todos os grupos solúveis, todos os grupos nilpotentes e todos os grupos simples na lista construída no item anterior. (Use as funções IsSimpleGroup e IsSolvableGroup).

4.3 Grupos gerados por permutações ou matrizes

Pode-se também definir grupo por geradores. Os geradores podem ser objetos multiplicáveis, tipicamente usamos matrizes e permutações. Primeiro, consideremos alguns exemplos com permutações.

gap> G := Group( (1,2), (1,2,3,4,5));
Group([ (1,2), (1,2,3,4,5) ])
gap> Size( G );
120
gap> G = SymmetricGroup( 5 );
true
gap> A := Group( (1,2,3),(3,4,5));
Group([ (1,2,3), (3,4,5) ])
gap> Size( A );
60
gap> A = AlternatingGroup( 5 );
true
gap> A = SymmetricGroup( 5 );
false

O grupo dihedral \(D_5\) de ordem \(10\) pode ser construído da forma seguinte.

gap> D := Group( (1,2,3,4,5),(2,5)(3,4));
Group([ (1,2,3,4,5), (2,5)(3,4) ])
gap> Size( D );
10
gap> Elements( D );
[ (), (2,5)(3,4), (1,2)(3,5), (1,2,3,4,5), (1,3)(4,5), (1,3,5,2,4), (1,4)(2,3), (1,4,2,5,3), (1,5,4,3,2), (1,5)(2,4) ]
gap> IsSubgroup( AlternatingGroup( 5 ), D );
true
gap> IsNormal( AlternatingGroup( 5 ), D );
false

4.4 Grupos gerados por matrizes

Pode-se também definir grupos de matrizes usando geradores. Considere por exemplo as seguintes duas matrizes sobre GF( 5 ): \[ m_1 = \begin{pmatrix} 2 & 0 \\ 0 & 1 \end{pmatrix}\quad \mbox{e}\quad m_2 = \begin{pmatrix} 2 & 1 \\ 2 & 0 \end{pmatrix}. \] O grupo gerado por \(m_1\) e \(m_2\) pode ser construído em GAP usando as seguintes instruções.

gap> m1 := [[2,0],[0,1]]*Z(5)^0;
[ [ Z(5), 0*Z(5) ], [ 0*Z(5), Z(5)^0 ] ]
gap> m2 := [[2,1],[2,0]]*Z(5)^0;
[ [ Z(5), Z(5)^0 ], [ Z(5), 0*Z(5) ] ]
gap> G := Group( m1, m2 );
Group([ [ [ Z(5), 0*Z(5) ], [ 0*Z(5), Z(5)^0 ] ], 
  [ [ Z(5), Z(5)^0 ], [ Z(5), 0*Z(5) ] ] ])
gap> Order( G );
480
gap> G = GL( 2, 5 );
true

4.5 Tarefa: O grupo de Heisenberg

Sobre um corpo \(\mathbb F\), o grupo de Heisenberg é o grupo \[ H=\left\{\begin{pmatrix} 1 & a & c \\ 0 & 1 & b \\ 0 & 0 & 1\end{pmatrix}\mid a, b, c \in\mathbb F\right\}. \]

O seguinte resultado é fácil de verificar.

Lema 4.1 Se \(\mathbb F\) é um corpo finito de ordem \(q\), então \(|H|=q^3\).

  1. Construa em GAP o grupo de Heisenberg sobre os corpos GF(2), GF(3), GF(5), GF( 9 ), GF( 25 ) como um grupo de matrizes dado por geradores. Calcule a ordem do grupo construido para verificar que tem o grupo certo.
  2. Escreva uma função heisenberg_group( q ) que devolve o grupo de Heisenberg sobre GF( q ) dado input q. A sua função precisa seguir o seguinte exemplo.
gap> H := heisenberg_group( 5 );
Group(
[ 
  [ [ Z(5)^0, Z(5)^0, 0*Z(5) ], [ 0*Z(5), Z(5)^0, 0*Z(5) ], 
      [ 0*Z(5), 0*Z(5), Z(5)^0 ] ], 
  [ [ Z(5)^0, 0*Z(5), 0*Z(5) ], [ 0*Z(5), Z(5)^0, Z(5)^0 ], 
      [ 0*Z(5), 0*Z(5), Z(5)^0 ] ] ])
gap> Order( H );
125
gap> H := heisenberg_group( 7 );
Group(
[ 
  [ [ Z(7)^0, Z(7)^0, 0*Z(7) ], [ 0*Z(7), Z(7)^0, 0*Z(7) ], 
      [ 0*Z(7), 0*Z(7), Z(7)^0 ] ], 
  [ [ Z(7)^0, 0*Z(7), 0*Z(7) ], [ 0*Z(7), Z(7)^0, Z(7)^0 ], 
      [ 0*Z(7), 0*Z(7), Z(7)^0 ] ] ])
gap> Order( H );
343
gap> H := heisenberg_group( 9 );
<matrix group of size 729 with 4 generators>
gap> Order( H );
729
  1. Investiga o grupo de Heisenberg usando a sua função construída em cima. Calcule o seu centro, subgrupo derivado, os termos da série derivada, série central superior, e série central inferior.

O grupo de Heisenberg \(H\) é gerado por dois geradores sobre o corpo \(\mathbb F_p\). Sobre um corpo \(\mathbb F_{p^k}\) o grupo é gerado por \(2k\) geradores. Para revisar como trabalhar sobre corpos finitos, consulte Seção 2.4; para ver como escrever uma função, consulte Seção 5.6. Para resolver o item 3., use as funções listadas no capítulo relevante do manual.