Skip to content
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

use stored OD values for factor groups #3248

Merged
merged 2 commits into from
Jan 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/src/Groups/group_characters.md
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@ symplectic_components(characters::Vector{GAPGroupClassFunction}, n::Int)
```@docs
class_multiplication_coefficient
known_class_fusion
known_class_fusions
order(tbl::GAPGroupCharacterTable)
possible_class_fusions
approximate_class_fusion
Expand Down
74 changes: 69 additions & 5 deletions experimental/OrthogonalDiscriminants/src/data.jl
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,11 @@
function orthogonal_discriminants(tbl::Oscar.GAPGroupCharacterTable)
p = characteristic(tbl)
if p == 0
id = identifier(tbl)
ordtbl = tbl
else
id = identifier(ordinary_table(tbl))
ordtbl = ordinary_table(tbl)
end
id = identifier(ordtbl)
res = fill("", number_conjugacy_classes(tbl))
if haskey(OD_simple_names, id)
simp = OD_simple_names[id]
Expand All @@ -112,13 +113,76 @@
res[l[2]] = l[4]
end
return res
else
#TODO: compute the reductions mod p (not dividing the group order)
fingolfin marked this conversation as resolved.
Show resolved Hide resolved
end
end
else
# Perhaps a factor of `tbl` belongs to the database.
facttbl = nothing
for r in known_class_fusions(ordtbl)
if 1 < length(class_positions_of_kernel(r[2]))
id = r[1]
if haskey(OD_simple_names, id)
simp = OD_simple_names[id]
data = OD_data[simp]
if haskey(data, id)
data = data[id]
facttbl = character_table(id)
if haskey(data, string(p))
if p != 0
facttbl = mod(facttbl, p)

Check warning on line 134 in experimental/OrthogonalDiscriminants/src/data.jl

View check run for this annotation

Codecov / codecov/patch

experimental/OrthogonalDiscriminants/src/data.jl#L134

Added line #L134 was not covered by tests
end
facttbl != nothing && break
end
end
end
end
end
if facttbl != nothing
# Set the known values for the factor.
mp = [findfirst(is_equal(restrict(x, tbl)), tbl) for x in facttbl]
data = data[string(p)]
for l in data
res[mp[l[2]]] = l[4]
end
# Set values for faithful characters if applicable.
perf = (count(chi -> degree(chi) == 1, tbl) == 1)
if perf && order(tbl) == 2*order(facttbl) && p != 2
# deal with the faithful characters of a perfect central extension 2.G,
# the image of the spinor norm is trivial
for i in 1:length(tbl)
chi = tbl[i]
Comment on lines +154 to +155
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for i in 1:length(tbl)
chi = tbl[i]
for chi in tbl

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need i in the assignments.

deg = degree(chi)
ind = indicator(chi)
if ind == 1 && length(class_positions_of_kernel(chi)) == 1
if mod(deg, 4) == 0
if p == 0
res[i] = "1"
else
res[i] = "O+"
end
elseif mod(deg, 2) == 0
if p == 0
res[i] = "-1"
else
# Check whether -1 is a square in the character field.
if mod(p-1, 4) == 0 || mod(degree(character_field(chi)[1]), 2) == 0
res[i] = "O+"

Check warning on line 171 in experimental/OrthogonalDiscriminants/src/data.jl

View check run for this annotation

Codecov / codecov/patch

experimental/OrthogonalDiscriminants/src/data.jl#L170-L171

Added lines #L170 - L171 were not covered by tests
else
res[i] = "O-"

Check warning on line 173 in experimental/OrthogonalDiscriminants/src/data.jl

View check run for this annotation

Codecov / codecov/patch

experimental/OrthogonalDiscriminants/src/data.jl#L173

Added line #L173 was not covered by tests
end
end
end
end
end
end
end
end

# `tbl` is outside the scope of the database.
# Fill missing values.
for i in 1:length(tbl)
if indicator(tbl[i]) == 1 && is_even(numerator(degree(tbl[i])))
if res[i] == "" && indicator(tbl[i]) == 1 && is_even(numerator(degree(tbl[i])))
res[i] = "?"
end
end
Expand Down Expand Up @@ -480,7 +544,7 @@
(!comment_matches(comment)) && (good_comment = false)
elseif comment_matches isa String
(!(comment_matches in comment)) && (good_comment = false)
elseif is_empty(intersect(comment, comment_matches ))
elseif is_empty(intersect(comment, comment_matches))

Check warning on line 547 in experimental/OrthogonalDiscriminants/src/data.jl

View check run for this annotation

Codecov / codecov/patch

experimental/OrthogonalDiscriminants/src/data.jl#L547

Added line #L547 was not covered by tests
good_comment = false
end
end
Expand Down
7 changes: 7 additions & 0 deletions experimental/OrthogonalDiscriminants/test/data.jl
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,13 @@ end
end
end

@testset "orthogonal_discriminants for central extensions" begin
name = "2.L3(4)"
t = character_table(name)
@test orthogonal_discriminants(t) ==
["","21","","","","","","","","105","","","1","1","1","1","-1","-1"]
end

using Documenter

#
Expand Down
1 change: 1 addition & 0 deletions src/GAP/wrappers.jl
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ GAP.@wrap CoefficientsFamily(x::GapObj)::GapObj
GAP.@wrap CoefficientsOfUnivariatePolynomial(x::GapObj)::GapObj
GAP.@wrap CoeffsCyc(x::GAP.Obj, y::Int)::GapObj
GAP.@wrap CollectionsFamily(x::GapObj)::GapObj
GAP.@wrap ComputedClassFusions(x::GapObj)::GapObj
GAP.@wrap ComputedPowerMaps(x::GapObj)::GapObj
GAP.@wrap Conductor(x::Any)::GapInt
GAP.@wrap ConjugacyClass(x::GapObj, y::GapObj)::GapObj
Expand Down
13 changes: 13 additions & 0 deletions src/Groups/group_characters.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1601,6 +1601,19 @@ function known_class_fusion(subtbl::GAPGroupCharacterTable, tbl::GAPGroupCharact
end
end

@doc raw"""
known_class_fusions(tbl::GAPGroupCharacterTable)

Return the vector of pairs `(name, fus)` where `name` is the identifier of
a character table
and `fus` is the stored class fusion from `tbl` to this table,
see [`known_class_fusion`](@ref).
"""
function known_class_fusions(tbl::GAPGroupCharacterTable)
return Tuple{String, Vector{Int64}}[(String(r.name), Vector{Int}(r.map))
for r in GAPWrap.ComputedClassFusions(GAPTable(tbl))]
end


#############################################################################
##
Expand Down
1 change: 1 addition & 0 deletions src/exports.jl
Original file line number Diff line number Diff line change
Expand Up @@ -883,6 +883,7 @@ export kernel
export klee_minty_cube
export klein_bottle
export known_class_fusion
export known_class_fusions
export koszul_complex
export koszul_homology
export koszul_matrix
Expand Down
Loading