-
Notifications
You must be signed in to change notification settings - Fork 129
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add letters
function for PcGroupElem
#4202
Changes from all commits
e9a4ac4
b910923
d362f67
27c24e7
89b8fe6
94cd03e
416fd8b
c350414
b552be6
11bdb25
1b80584
2d0bfb8
e7f4da0
5cfffd0
43532ba
a80667b
30a5a62
2cd5cb9
5dd04b8
c07db31
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||
---|---|---|---|---|
|
@@ -415,7 +415,6 @@ function _GAP_collector_from_the_left(c::GAP_Collector) | |||
return cGAP::GapObj | ||||
end | ||||
|
||||
|
||||
# Create the collector on the GAP side on demand | ||||
function underlying_gap_object(c::GAP_Collector) | ||||
if ! isdefined(c, :X) | ||||
|
@@ -473,6 +472,159 @@ function pc_group(c::GAP_Collector) | |||
end | ||||
end | ||||
|
||||
""" | ||||
letters(g::Union{PcGroupElem, SubPcGroupElem}) | ||||
|
||||
Return the letters of `g` as a list of integers, each entry corresponding to | ||||
a group generator. | ||||
|
||||
This method can produce letters represented by negative numbers. A negative number | ||||
indicates the inverse of the generator at the corresponding positive index. | ||||
|
||||
For example, as shown below, an output of `-1` refers to the "inverse of the first generator". | ||||
|
||||
See also [`syllables(::Union{PcGroupElem, SubPcGroupElem})`](@ref). | ||||
|
||||
# Examples | ||||
|
||||
```jldoctest | ||||
julia> g = abelian_group(PcGroup, [0, 5]) | ||||
Pc group of infinite order | ||||
|
||||
julia> x = g[1]^-3 * g[2]^-3 | ||||
g1^-3*g2^2 | ||||
|
||||
julia> letters(x) | ||||
5-element Vector{Int64}: | ||||
-1 | ||||
-1 | ||||
-1 | ||||
2 | ||||
2 | ||||
``` | ||||
|
||||
```jldoctest | ||||
julia> gg = small_group(6, 1) | ||||
Pc group of order 6 | ||||
|
||||
julia> x = gg[1]^5*gg[2]^-4 | ||||
f1*f2^2 | ||||
|
||||
julia> letters(x) | ||||
3-element Vector{Int64}: | ||||
1 | ||||
2 | ||||
2 | ||||
``` | ||||
""" | ||||
function letters(g::Union{PcGroupElem, SubPcGroupElem}) | ||||
# check if we have a PcpGroup element | ||||
if GAPWrap.IsPcpElement(GapObj(g)) | ||||
exp = GAPWrap.Exponents(GapObj(g)) | ||||
|
||||
# Should we check if the output is not larger than the | ||||
# amount of generators? Requires use of `parent`. | ||||
# @assert length(exp) == length(gens(parent(g))) | ||||
|
||||
w = [sign(e) * i for (i, e) in enumerate(exp) for _ in 1:abs(e)] | ||||
return Vector{Int}(w) | ||||
else # finite PcGroup | ||||
w = GAPWrap.UnderlyingElement(GapObj(g)) | ||||
return Vector{Int}(GAPWrap.LetterRepAssocWord(w)) | ||||
end | ||||
end | ||||
|
||||
""" | ||||
syllables(g::Union{PcGroupElem, SubPcGroupElem}) | ||||
|
||||
Return the syllables of `g` as a list of pairs of integers, each entry corresponding to | ||||
a group generator and its exponent. | ||||
fingolfin marked this conversation as resolved.
Show resolved
Hide resolved
|
||||
|
||||
# Examples | ||||
|
||||
```jldoctest | ||||
julia> gg = small_group(6, 1) | ||||
Pc group of order 6 | ||||
|
||||
julia> x = gg[1]^5*gg[2]^-4 | ||||
f1*f2^2 | ||||
|
||||
julia> s = syllables(x) | ||||
2-element Vector{Pair{Int64, ZZRingElem}}: | ||||
1 => 1 | ||||
2 => 2 | ||||
|
||||
julia> gg(s) | ||||
f1*f2^2 | ||||
|
||||
julia> gg(s) == x | ||||
true | ||||
``` | ||||
|
||||
```jldoctest | ||||
julia> g = abelian_group(PcGroup, [5, 0]) | ||||
Pc group of infinite order | ||||
|
||||
julia> x = g[1]^-3 * g[2]^-3 | ||||
g1^2*g2^-3 | ||||
|
||||
julia> s = syllables(x) | ||||
2-element Vector{Pair{Int64, ZZRingElem}}: | ||||
1 => 2 | ||||
2 => -3 | ||||
|
||||
julia> g(s) | ||||
g1^2*g2^-3 | ||||
|
||||
julia> g(s) == x | ||||
true | ||||
``` | ||||
""" | ||||
lgoettgens marked this conversation as resolved.
Show resolved
Hide resolved
|
||||
function syllables(g::Union{PcGroupElem, SubPcGroupElem}) | ||||
# check if we have a PcpGroup element | ||||
if GAPWrap.IsPcpElement(GapObj(g)) | ||||
l = GAPWrap.GenExpList(GapObj(g)) | ||||
else # finite PcGroup | ||||
l = GAPWrap.ExtRepOfObj(GapObj(g)) | ||||
end | ||||
|
||||
@assert iseven(length(l)) | ||||
return Pair{Int, ZZRingElem}[l[i-1] => l[i] for i = 2:2:length(l)] | ||||
end | ||||
|
||||
# Convert syllables in canonical form into exponent vector | ||||
function _exponent_vector(sylls::Vector{Pair{Int64, ZZRingElem}}, n) | ||||
res = zeros(ZZRingElem, n) | ||||
for pair in sylls | ||||
@assert res[pair.first] == 0 #just to make sure | ||||
res[pair.first] = pair.second | ||||
end | ||||
return res | ||||
end | ||||
|
||||
# Convert syllables in canonical form into group element | ||||
fingolfin marked this conversation as resolved.
Show resolved
Hide resolved
|
||||
function (G::PcGroup)(sylls::Vector{Pair{Int64, ZZRingElem}}; check::Bool=true) | ||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you also add a similar constructor which takes an exponent vector, i.e., an inverse to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. One needs to watch out for the semantic difference to the already existing function for FPGroups in Oscar.jl/src/Groups/GAPGroups.jl Line 2348 in 24711ee
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ugh, OK. perhaps we should kill that (is it documented?) first then. In GAP it made some sense to use such a flat list to avoid memory, as there are no tuples in GAP, only lists. But in Julia there is no real benefit of this over a But that is way beyond this PR. So let's leave out the constructor I mentioned. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No, not documented, but used for serialization. I haven't looked into how it is used there, so maybe we can just adapt the deserialization function, in the worst case it needs an upgrade script. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
maybe @ThomasBreuer can look into that? |
||||
# check if the syllables are in canonical form | ||||
if check | ||||
indices = map(p -> p.first, sylls) | ||||
@req allunique(indices) "given syllables have repeating generators" | ||||
@req issorted(indices) "given syllables must be in ascending order" | ||||
end | ||||
|
||||
e = _exponent_vector(sylls, ngens(G)) | ||||
|
||||
# check if G is an underlying PcpGroup | ||||
GG = GapObj(G) | ||||
if GAPWrap.IsPcpGroup(GG) | ||||
coll = GAPWrap.Collector(GG) | ||||
x = GAPWrap.PcpElementByExponentsNC(coll, GapObj(e, true)) | ||||
else # finite PcGroup | ||||
pcgs = GAPWrap.FamilyPcgs(GG) | ||||
x = GAPWrap.PcElementByExponentsNC(pcgs, GapObj(e, true)) | ||||
end | ||||
|
||||
return Oscar.group_element(G, x) | ||||
end | ||||
|
||||
# Create an Oscar collector from a GAP collector. | ||||
|
||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Note that we can also produce negative numbers: e.g. -3 means "inverse of 3rd generator". This should be explained, and perhaps an example added showing that. E.g. based on this:
Perhaps also add something like this (and then mirror it in the other function)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have added a small example with some brief explanation to
letters
for this. However I am unsure if the example is good as I was not able to get elements with negative exponents and test.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For that you need an infinite group. E.g.
or