[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 ... ]) ]