```
[1]:
```

```
using Oscar
```

```
----- ----- ----- - -----
| | | | | | | | | |
| | | | | | | |
| | ----- | | | |-----
| | | | |-----| | |
| | | | | | | | | |
----- ----- ----- - - - -
...combining (and extending) ANTIC, GAP, Polymake and Singular
Version 0.5.0 ...
... which comes with absolutely no warranty whatsoever
Type: '?Oscar' for more information
(c) 2019-2020 by The Oscar Development Team
```

# Groups in OSCAR

Oscar handles group theoretic questions via combining different systems: GAP, Hecke, AbstractAlgebra, …

Growing documentation can be found at the following link:

https://github.com/oscar-system/Oscar.jl

Let’s see how to explore Rosa’s group using Oscar.

## Rosa’s group

Rosa gave us a group in terms of its ID in **GAP’s SmallGroups library**. What can we say about this group?

```
[2]:
```

```
G = small_group(8,3)
```

```
[2]:
```

```
<pc group of size 8 with 3 generators>
```

The group’s ID already tells us that \(G\) has 8 elements. Moreover, we know that \(G\) can be generated by 3 elements (not the minimum number of generators necessarily!).

The number of (isomorphism classes of) groups of order \(8=2^3\) is:

```
[3]:
```

```
number_small_groups(8)
```

```
[3]:
```

A **curiosity**! The number of groups of order \(1024=2^{10}\) is:

```
[4]:
```

```
number_small_groups(1024)
```

```
[4]:
```

which is more than 99% of all groups of order at most 2000!

So going back to our investigation, how can we determine what group \(G\) is?

```
[5]:
```

```
isabelian(G)
```

```
[5]:
```

So we know that \(G\) is not abelian, which leaves us with only 2 possibilities.. \(D_8\) and \(Q_8\). Indeed:

```
[6]:
```

```
p=2
for i in 1:5
T = small_group(p^3,i);
K = derived_subgroup(T)[1];
println(K)
println(isabelian(T))
end
```

```
Group([ ])
true
Group([ ])
true
Group([ f3 ])
false
Group([ f3 ])
false
Group([ ])
true
```

and we also know from the Elementary Divisors Theorem that every abelian group of order 8 is isomorphic to one of: \(\mathbb{Z}/(8)\), \(\mathbb{Z}/(4)\times\mathbb{Z}/(2)\), or \(\mathbb{Z}/(2)\times\mathbb{Z}/(2)\times \mathbb{Z}/(2)\).

Another way:

```
[7]:
```

```
p=2
for i in 1:5
T = small_group(p^3,i);
if isabelian(T)==false
println(i)
end
end
```

```
3
4
```

Define now:

```
[8]:
```

```
D = dihedral_group(8)
#small_group_identification(D)
```

```
[8]:
```

```
<pc group of size 8 with 3 generators>
```

```
[9]:
```

```
Q = quaternion_group(8)
#small_group_identification(Q)
```

```
[9]:
```

```
<pc group of size 8 with 3 generators>
```

## (Symmetric and) Permutation groups

Recall that the group \(G\) was born as the Galois group associated to the polynomial

and thus naturally as a subgroup of \(\mathrm{S}_8\).

An oracle (or Rosa?) tells me that there is a labeling of the roots \(\alpha_1,\ldots, \alpha_8\) of \(f\) such that the group \(G\) is generated by the following elements of \(\mathrm{S}_8\):

Let’s check these guys generate a copy of \(D_8\) in \(\mathrm{S}_8\)!

To define a symmetric group:

```
[10]:
```

```
S = symmetric_group(8)
```

```
[10]:
```

```
Sym( [ 1 .. 8 ] )
```

How to define a cycle in the symmetric group:

```
[11]:
```

```
cperm([1,2,3,4])
```

```
[11]:
```

```
(1,2,3,4)
```

We now define the generators of our Galois group as a subgroup of the symmetric group of degree 8:

```
[12]:
```

```
s=cperm([1,8])*cperm([2,7])*cperm([3,6])*cperm([4,5])
```

```
[12]:
```

```
(1,8)(2,7)(3,6)(4,5)
```

```
[13]:
```

```
t=cperm([1,2])*cperm([3,5])*cperm([4,6])*cperm([7,8])
```

```
[13]:
```

```
(1,2)(3,5)(4,6)(7,8)
```

```
[14]:
```

```
u=cperm([1,5,8,4])*cperm([2,6,7,3])
```

```
[14]:
```

```
(1,5,8,4)(2,6,7,3)
```

Defining \(G\) via its generators as a subgroup of \(\mathrm{S}_8\) returns a pair consisting of the group \(G\) together with an embedding \(G\rightarrow \mathrm{S}_8\). If you want to just work with the group, don’t forget to **just take** the first entry!

```
[15]:
```

```
H = sub(S,[s,t,u])#[1] #Here G is called H!
```

```
[15]:
```

```
[23]:
```

```
small_group_identification(H[1])
```

```
[23]:
```

## Types and methods

There is a number of other questions one can ask about the group \(G\): some *methods are only implemented for specific types*! The types available in Oscar are:

groups of permutations

groups of matrices

finitely presented groups

polycyclic groups

direct products of two groups

automorphism groups

```
[17]:
```

```
typeof(H)
```

```
[17]:
```

```
Tuple{PermGroup,Oscar.GAPGroupHomomorphism{PermGroup,PermGroup}}
```

```
[18]:
```

```
typeof(G)
```

```
[18]:
```

```
PcGroup
```

```
[19]:
```

```
methodswith(typeof(H))
#istransitive(H)
#number_moved_points(H)
```

```
[19]:
```

```
[20]:
```

```
#istransitive(G) #returns an error!
```

Some GAP commands for computing normal series in G are also available:

```
[21]:
```

```
derived_series(G)
```

```
[21]:
```

```
3-element Array{PcGroup,1}:
<pc group of size 8 with 3 generators>
Group([ f3 ])
Group([ ])
```

And even if the GAP command has not been translated into Oscar, you can always call for GAP directly:

```
[22]:
```

```
GAP.Globals.LowerCentralSeries(GAP.Globals.SmallGroup(8,3))
```

```
[22]:
```

```
GAP: [ <pc group of size 8 with 3 generators>, Group([ f3 ]), Group([ <identity> of ... ]) ]
```