-
Notifications
You must be signed in to change notification settings - Fork 126
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
base: master
Are you sure you want to change the base?
Changes from 9 commits
e9a4ac4
b910923
d362f67
27c24e7
89b8fe6
94cd03e
416fd8b
c350414
b552be6
11bdb25
1b80584
2d0bfb8
e7f4da0
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 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -307,7 +307,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) | ||||||||||||||||||
|
@@ -365,3 +364,65 @@ 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. | ||||||||||||||||||
|
||||||||||||||||||
# Examples | ||||||||||||||||||
```jldoctest | ||||||||||||||||||
julia> c = collector(2, Int); | ||||||||||||||||||
|
||||||||||||||||||
julia> Oscar.set_relative_orders!(c, [2, 3]) | ||||||||||||||||||
|
||||||||||||||||||
julia> Oscar.set_conjugate!(c, 2, 1, [2 => 2]) | ||||||||||||||||||
|
||||||||||||||||||
julia> gg = pc_group(c) | ||||||||||||||||||
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. The interface for construction
Suggested change
and then I think the rest of the example stays unchanged. Same remark applies below. 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. Perfect, no worries! I have now updated the examples with this replacement. |
||||||||||||||||||
Pc group of order 6 | ||||||||||||||||||
|
||||||||||||||||||
julia> letters(gg[1]^5*gg[2]^-4) | ||||||||||||||||||
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. This example is not quite obvious for a reader. Better to show the intermediate result, that should make the connection to the output of
Suggested change
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. Good idea! I have updated the example in both |
||||||||||||||||||
3-element Vector{Int64}: | ||||||||||||||||||
1 | ||||||||||||||||||
2 | ||||||||||||||||||
2 | ||||||||||||||||||
``` | ||||||||||||||||||
""" | ||||||||||||||||||
function letters(g::Union{PcGroupElem, SubPcGroupElem}) | ||||||||||||||||||
w = GAPWrap.UnderlyingElement(GapObj(g)) | ||||||||||||||||||
return Vector{Int}(GAPWrap.LetterRepAssocWord(w)) | ||||||||||||||||||
end | ||||||||||||||||||
|
||||||||||||||||||
function syllables(g::Union{PcGroupElem, SubPcGroupElem}) | ||||||||||||||||||
l = GAPWrap.ExtRepOfObj(GapObj(g)) | ||||||||||||||||||
@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 | ||||||||||||||||||
#Thomas | ||||||||||||||||||
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.
Suggested change
|
||||||||||||||||||
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
|
||||||||||||||||||
#Thomas | ||||||||||||||||||
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.
Suggested change
|
||||||||||||||||||
function (G::PcGroup)(sylls::Vector{Pair{Int64, ZZRingElem}}, check::Bool=true) | ||||||||||||||||||
lgoettgens marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||
# check if the syllables are in canonical form | ||||||||||||||||||
if check | ||||||||||||||||||
indices = map(p -> p.first, sylls) | ||||||||||||||||||
unq_indices = unique(indices) # maintains order | ||||||||||||||||||
@req length(indices) == length(unq_indices) "given syllables have repeating generators" | ||||||||||||||||||
@req issorted(unq_indices) "given syllables must be in ascending order" | ||||||||||||||||||
lgoettgens marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||
end | ||||||||||||||||||
|
||||||||||||||||||
e = _exponent_vector(sylls, ngens(G)) | ||||||||||||||||||
pcgs = Oscar.GAPWrap.FamilyPcgs(GapObj(G)) | ||||||||||||||||||
x = Oscar.GAPWrap.PcElementByExponentsNC(pcgs, GapObj(e, true)) | ||||||||||||||||||
return Oscar.group_element(G, x) | ||||||||||||||||||
end |
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.