Skip to content

Commit

Permalink
various improvements for characters (#2519)
Browse files Browse the repository at this point in the history
* various improvements for characters

- adjusted the print functions for character tables to the rules
  from "Details on printing in Oscar"
  (and adjusted the manual examples and tests)

- document the output of the text/plain method for `show`
  (addresses issue #2482)

- fixed the text/latex output in the case that the irrationalities
  are shown via a legend (and that there are several lines in the legend)

- added more documentation and doctests

- changed `character_field` for Brauer characters:
  The field is now a *finite field* in this case.

- use the `GAPWrap` approach for more GAP functions

* move functions, do not copy them ...

* further improvements

- fixed a test for `labelled_matrix_formatted`
- renamed `group_class_function` to `class_function`
- added `natural_character` for matrix groups in positive characteristic
  and for group homomorphisms
- admit `IntegerUnion` for the `characteristic` of character tables,
  not just `Int`

* fixed doctests

* adjustments/fixes

- adjusted an `is_prime_power_with_data` call
  (The ordering of return values of `is_prime_power_with_data`
  has been changed in Nemocas/Nemo.jl/pull/1484.)

- adjusted the type of a (perhaps empty) list
  (This seemed to work at least up to Julia 1.8.5.)

- fixed some doctests
  • Loading branch information
ThomasBreuer authored Jul 25, 2023
1 parent ff00abb commit b0d2567
Show file tree
Hide file tree
Showing 15 changed files with 903 additions and 236 deletions.
14 changes: 11 additions & 3 deletions docs/src/Groups/group_characters.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,14 @@ of ``G`` (or the `j`-th conjugacy class of ``p``-regular elements
in the case of Brauer tables).

Ordinary and ``p``-modular Brauer tables in OSCAR are distinguished by
the field `characteristic`; its value is `0` for ordinary tables and
``p`` otherwise.
their [`characteristic(tbl::GAPGroupCharacterTable)`](@ref);
its value is `0` for ordinary tables and ``p`` otherwise.

```@docs
GAPGroupCharacterTable
character_table
Base.show(io::IO, ::MIME"text/plain", tbl::GAPGroupCharacterTable)
characteristic(tbl::GAPGroupCharacterTable)
Base.mod(tbl::GAPGroupCharacterTable, p::Int)
all_character_table_names
```
Expand All @@ -101,16 +103,19 @@ indicator
is_faithful(chi::GAPGroupClassFunction)
is_rational(chi::GAPGroupClassFunction)
is_irreducible(chi::GAPGroupClassFunction)
schur_index
schur_index(chi::GAPGroupClassFunction, recurse::Bool = true)
det(chi::GAPGroupClassFunction)
order(chi::GAPGroupClassFunction)
order_field_of_definition(chi::GAPGroupClassFunction)
```

## Attributes of character tables

```@docs
character_parameters
class_names(tbl::GAPGroupCharacterTable)
class_parameters
conjugacy_classes(tbl::GAPGroupCharacterTable)
decomposition_matrix
identifier
induced_cyclic(tbl::GAPGroupCharacterTable)
Expand All @@ -120,6 +125,7 @@ names_of_fusion_sources
class_lengths
orders_centralizers
orders_class_representatives
ordinary_table(tbl::GAPGroupCharacterTable)
trivial_character(tbl::GAPGroupCharacterTable)
```

Expand All @@ -128,6 +134,8 @@ trivial_character(tbl::GAPGroupCharacterTable)
```@docs
natural_character(G::PermGroup)
natural_character(G::Union{MatrixGroup{QQFieldElem}, MatrixGroup{nf_elem}})
natural_character(G::MatrixGroup{T, MT}) where T <: FinFieldElem where MT
natural_character(rho::GAPGroupHomomorphism)
trivial_character(G::GAPGroup)
```

Expand Down
14 changes: 3 additions & 11 deletions experimental/GModule/GModule.jl
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,6 @@ function __init__()
set_verbose_level(:MinField, 0)
end

function Hecke.number_field(::QQField, chi::Oscar.GAPGroupClassFunction; cached::Bool = false)
return number_field(QQ, map(x->GAP.gap_to_julia(QQAbElem, x), chi.values), cached = cached)
end

function irreducible_modules(G::Oscar.GAPGroup)
im = GAP.Globals.IrreducibleRepresentations(G.X)
IM = GModule[]
Expand Down Expand Up @@ -362,16 +358,16 @@ function Oscar.character(C::GModule{<:Any, <:Generic.FreeModule{nf_elem}})
QQAb = abelian_closure(QQ)[1]
K = cyclotomic_field(QQAb, Int(c))[1]
fl, em = is_subfield(k, K)
return Oscar.group_class_function(group(C), [QQAb(em(preimage(mkK, x[2]))) for x = chr])
return Oscar.class_function(group(C), [QQAb(em(preimage(mkK, x[2]))) for x = chr])
end

function Oscar.character(C::GModule{<:Any, <:Generic.FreeModule{QQFieldElem}})
QQAb = abelian_closure(QQ)[1]
return Oscar.group_class_function(group(C), [QQAb(x[2]) for x = _character(C)])
return Oscar.class_function(group(C), [QQAb(x[2]) for x = _character(C)])
end

function Oscar.character(C::GModule{<:Any, <:Generic.FreeModule{<:AbstractAlgebra.FieldElem}})
return Oscar.group_class_function(group(C), [base_ring(C)(x[2]) for x = _character(C)])
return Oscar.class_function(group(C), [base_ring(C)(x[2]) for x = _character(C)])
end


Expand Down Expand Up @@ -1161,10 +1157,6 @@ function Oscar.abelian_group(M::Generic.FreeModule{fqPolyRepFieldElem})
return A, MapFromFunc(A, M, to_M, to_A)
end

function Oscar.group(chi::Oscar.GAPGroupClassFunction)
return chi.table.GAPGroup
end

function Oscar.gmodule(chi::Oscar.GAPGroupClassFunction)
f = GAP.Globals.IrreducibleAffordingRepresentation(chi.values)
K = abelian_closure(QQ)[1]
Expand Down
1 change: 0 additions & 1 deletion experimental/GModule/Misc.jl
Original file line number Diff line number Diff line change
Expand Up @@ -172,5 +172,4 @@ end
Base.getindex(::QQField, a::QQAbElem) = number_field(QQ, a)
Base.getindex(::QQField, a::Vector{QQAbElem}) = number_field(QQ, a)
Base.getindex(::QQField, a::QQAbElem...) = number_field(QQ, [x for x =a])
Base.getindex(::QQField, chi::Oscar.GAPGroupClassFunction) = number_field(QQ, chi)

2 changes: 1 addition & 1 deletion experimental/SymmetricIntersections/src/representations.jl
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ function character_representation(RR::RepRing{S, T}, f::GAPGroupHomomorphism{T,
b = f(representative(h))
push!(coll, Q(trace(b)))
end
c = Oscar.group_class_function(character_table_underlying_group(RR), coll)
c = Oscar.class_function(character_table_underlying_group(RR), coll)
return c
end

Expand Down
44 changes: 44 additions & 0 deletions src/GAP/wrappers.jl
Original file line number Diff line number Diff line change
Expand Up @@ -14,50 +14,75 @@ using GAP

GAP.@wrap AlgExtElm(x::GapObj, y::GAP.Obj)::GapObj
GAP.@wrap AlgebraicExtension(x::GapObj, y::GapObj)::GapObj
GAP.@wrap AntiSymmetricParts(x::GapObj, y::GapObj, z::GapInt)::GapObj
GAP.@wrap AsList(x::GapObj)::GapObj
GAP.@wrap AsSet(x::GapObj)::GapObj
GAP.@wrap AtlasIrrationality(x::GapObj)::GAP.Obj
GAP.@wrap Basis(x::GapObj)::GapObj
GAP.@wrap Basis(x::GapObj, y::GapObj)::GapObj
GAP.@wrap BasisNC(x::GapObj, y::GapObj)::GapObj
GAP.@wrap CanonicalBasis(x::GapObj)::GapObj
GAP.@wrap CentreOfCharacter(x::GapObj, y::GapObj)::GapObj
GAP.@wrap CF(x::Any, y::Any)::GapObj
GAP.@wrap CF(x::Any)::GapObj
GAP.@wrap CHAR_FFE_DEFAULT(x::Any)::GapInt
GAP.@wrap Characteristic(x::Any)::GapInt
GAP.@wrap CharacterParameters(x::GapObj)::GapObj
GAP.@wrap CharacterTable(x::GapObj)::GapObj
GAP.@wrap CharacterTable(x::GapObj, y::GAP.Obj)::GapObj
GAP.@wrap CharacterTableWreathSymmetric(x::GapObj, y::GapInt)::GapObj
GAP.@wrap ClassFunction(x::GapObj, y::GapObj)::GapObj
GAP.@wrap ClassNames(x::GapObj)::GapObj
GAP.@wrap ClassMultiplicationCoefficient(x::GapObj, y::Int, z::Int, t::Int)::GAP.Obj
GAP.@wrap ClassPositionsOfCentre(x::GapObj)::GapObj
GAP.@wrap ClassPositionsOfPCore(x::GapObj, y::GAP.Obj)::GapObj
GAP.@wrap ClassParameters(x::GapObj)::GapObj
GAP.@wrap Coefficients(x::Any, y::Any)::GapObj
GAP.@wrap CoefficientsFamily(x::GapObj)::GapObj
GAP.@wrap CoefficientsOfUnivariatePolynomial(x::GapObj)::GapObj
GAP.@wrap CoeffsCyc(x::GAP.Obj, y::Int)::GapObj
GAP.@wrap ComputedPowerMaps(x::GapObj)::GapObj
GAP.@wrap Conductor(x::Any)::GapInt
GAP.@wrap ConjugacyClasses(x::GapObj)::GapObj
GAP.@wrap CycList(x::GapObj)::GapInt
GAP.@wrap CyclotomicPol(x::Int)::GapObj
GAP.@wrap Decomposition(x::GapObj, y::GapObj, z::GAP.Obj)::GapObj
GAP.@wrap DecompositionMatrix(x::GapObj)::GapObj
GAP.@wrap DefiningPolynomial(x::GapObj)::GapObj
GAP.@wrap DegreeFFE(x::Any)::Int
GAP.@wrap DegreeOfLaurentPolynomial(x::GapObj)::GapInt
GAP.@wrap DegreeOverPrimeField(x::GapObj)::Int
GAP.@wrap DenominatorCyc(x::Any)::GapInt
GAP.@wrap DenominatorRat(x::Any)::GapInt
GAP.@wrap DescriptionOfRootOfUnity(x::Any)::GapObj
GAP.@wrap DeterminantOfCharacter(x::GapObj)::GapObj
GAP.@wrap Dimension(x::GapObj)::Int
GAP.@wrap E(x::Any)::GapInt
GAP.@wrap EigenvaluesChar(x::GapObj, y::GAP.Obj)::GapObj
GAP.@wrap Elements(x::GapObj)::GapObj
GAP.@wrap ElementsFamily(x::GapObj)::GapObj
GAP.@wrap ELMS_LIST(x::GapObj, y::GapObj)::GapObj
GAP.@wrap ExtRepOfObj(x::GapObj)::GapObj
GAP.@wrap ExtRepPolynomialRatFun(x::GapObj)::GapObj
GAP.@wrap FamilyObj(x::GAP.Obj)::GapObj
GAP.@wrap Field(x::Any)::GapObj
GAP.@wrap FreeAbelianGroup(x::Int)::GapObj
GAP.@wrap FreeGeneratorsOfFpGroup(x::GapObj)::GapObj
GAP.@wrap FreeGroupOfFpGroup(x::GapObj)::GapObj
GAP.@wrap FusionConjugacyClasses(x::GapObj, y::GapObj)::GapObj
GAP.@wrap GaloisCyc(x::GAP.Obj, GapInt)::GAP.Obj
GAP.@wrap GeneratorsOfField(x::GapObj)::GapObj
GAP.@wrap GeneratorsOfGroup(x::GapObj)::GapObj
GAP.@wrap GetFusionMap(x::GapObj, y::GapObj)::GapObj
GAP.@wrap GF(x::Any, y::Any)::GapObj
GAP.@wrap GF(x::Any)::GapObj
GAP.@wrap GroupHomomorphismByFunction(x1, x2, x3)::GapObj
GAP.@wrap GroupHomomorphismByFunction(x1, x2, x3, x4)::GapObj
GAP.@wrap GroupHomomorphismByFunction(x1, x2, x3, x4, x5)::GapObj
GAP.@wrap HasCharacterParameters(x::GapObj)::Bool
GAP.@wrap HasClassParameters(x::GapObj)::Bool
GAP.@wrap HasMaximalAbelianQuotient(x::Any)::Bool
GAP.@wrap HasMaxes(x::GapObj)::Bool
GAP.@wrap HasSize(x::Any)::Bool
GAP.@wrap Image(x::Any, y::Any)::GapObj
GAP.@wrap Image(x::Any)::GapObj
Expand All @@ -67,6 +92,10 @@ GAP.@wrap Indeterminate(x::GapObj)::GapObj
GAP.@wrap Indeterminate(x::GapObj, y::GAP.Obj)::GapObj
GAP.@wrap IndeterminateNumberOfUnivariateRationalFunction(x::GapObj)::Int
GAP.@wrap IndeterminatesOfPolynomialRing(x::GapObj)::GapObj
GAP.@wrap Indicator(x::GapObj, y::GapObj, z::GapInt)::GapObj
GAP.@wrap InducedClassFunctionsByFusionMap(x::GapObj, y::GapObj, z::GapObj, t::GapObj)::GapObj
GAP.@wrap InducedClassFunction(x::GapObj, y::GapObj)::GapObj
GAP.@wrap InducedCyclic(x::GapObj)::GapObj
GAP.@wrap INT_FFE_DEFAULT(x::Any)::GapInt
GAP.@wrap IntFFE(x::Any)::GapInt
GAP.@wrap Inverse(x::GapObj)::GapObj
Expand Down Expand Up @@ -171,14 +200,18 @@ GAP.@wrap IsZero(x::Any)::Bool
GAP.@wrap IsZmodnZObj(x::Any)::Bool
GAP.@wrap IsZmodnZObjNonprimeCollection(x::Any)::Bool
GAP.@wrap Iterator(x::Any)::GapObj
GAP.@wrap KernelOfCharacter(x::GapObj, y::GapObj)::GapObj
GAP.@wrap LargestMovedPoint(x::Any)::Int
GAP.@wrap LeftActingDomain(x::GapObj)::GapObj
GAP.@wrap LinearCombination(x::GapObj, y::GapObj)::GapObj
GAP.@wrap MatScalarProducts(x::GapObj, y::GapObj, z::GapObj)::GapObj
GAP.@wrap Maxes(x::GapObj)::GapObj
GAP.@wrap MinimalPolynomial(x::GapObj, y::GAP.Obj)::GapObj
GAP.@wrap MinimalGeneratingSet(x::GapObj)::GapObj
GAP.@wrap mod(x::Any, y::Any)::GAP.Obj
GAP.@wrap NamesOfFusionSources(x::GapObj)::GapObj
GAP.@wrap NextIterator(x::GapObj)::Any
GAP.@wrap NormalSubgroupClasses(x::GapObj, y::GAP.Obj)::GapObj
GAP.@wrap NrCols(x::GapObj)::Int
GAP.@wrap NrConjugacyClasses(x::Any)::GapInt
GAP.@wrap NrRows(x::GapObj)::Int
Expand All @@ -193,29 +226,40 @@ GAP.@wrap OnSets(x::GapObj, y::GapObj)::GapObj
GAP.@wrap OnSetsSets(x::GapObj, y::GapObj)::GapObj
GAP.@wrap OnTuples(x::GapObj, y::GapObj)::GapObj
GAP.@wrap Order(x::Any)::GapInt
GAP.@wrap OrthogonalComponents(x::GapObj, y::GapObj, z::GapInt)::GapObj
GAP.@wrap OrthogonalDiscriminants(x::GapObj)::GapObj
GAP.@wrap Permuted(x::GapObj, y::GapObj)::GapObj
GAP.@wrap PolynomialByExtRep(x::GapObj, y::GapObj)::GapObj
GAP.@wrap PolynomialRing(x::GapObj)::GapObj
GAP.@wrap PolynomialRing(x::GapObj, y::Int)::GapObj
GAP.@wrap PossibleClassFusions(x::GapObj, y::GapObj)::GapObj
GAP.@wrap PrimePGroup(x::GapObj)::GapInt
GAP.@wrap PrimitiveElement(x::GapObj)::GapObj
GAP.@wrap Range(x::GapObj)::GapObj
GAP.@wrap ReduceCoeffs(x::GapObj, y::GapObj)
GAP.@wrap RelatorsOfFpGroup(x::GapObj)::GapObj
GAP.@wrap Representative(x::GapObj)::GAP.Obj
GAP.@wrap ScalarProduct(x::GapObj, y::GapObj, z::GapObj)::GAP.Obj
GAP.@wrap SchurIndexByCharacter(x::GapObj, y::GapObj, z::GapObj)::GAP.Obj
GAP.@wrap SetMaximalAbelianQuotient(x::Any, y::Any)::Nothing
GAP.@wrap SetSize(x::Any, y::Any)::Nothing
GAP.@wrap Size(x::Any)::GapInt
GAP.@wrap SizeOfFieldOfDefinition(x::GapObj, y::GapInt)::GapInt
GAP.@wrap SizesCentralizers(x::GapObj)::GapObj
GAP.@wrap SizesConjugacyClasses(x::GapObj)::GapObj
GAP.@wrap Source(x::GapObj)::GapObj
GAP.@wrap Sqrt(x::Int64)::GAP.Obj
GAP.@wrap StringViewObj(x::Any)::GapObj
GAP.@wrap SymmetricParts(x::GapObj, y::GapObj, z::GapInt)::GapObj
GAP.@wrap Symmetrizations(x::GapObj, y::GapObj, z::GapInt)::GapObj
GAP.@wrap SymplecticComponents(x::GapObj, y::GapObj, z::GapInt)::GapObj
GAP.@wrap UnderlyingElement(x::GapObj)::GapObj
GAP.@wrap UnderlyingRingElement(x::GapObj)::GapObj
GAP.@wrap UnivariatePolynomialByCoefficients(x::GapObj, y::GapObj, z::Int)::GapObj
GAP.@wrap Value(x::GapObj, y::Any)::Any
GAP.@wrap Value(x::GapObj, y::Any, z::Any)::Any
GAP.@wrap Value(x::GapObj, y::GapObj, z::GapObj, a::Any)::Any
GAP.@wrap ValuesOfClassFunction(x::GapObj)::GapObj
GAP.@wrap Z(x::Any)::GAP.Obj
GAP.@wrap Zero(x::Any)::GAP.Obj

Expand Down
18 changes: 16 additions & 2 deletions src/Groups/MatrixDisplay.jl
Original file line number Diff line number Diff line change
Expand Up @@ -419,8 +419,22 @@ function labelled_matrix_formatted(io::IO, mat::Matrix{String})
end

# footer (vector of strings)
for line in footer
write(io, line, "\n")
if length(footer) > 0
if TeX
write(io, "\n\\begin{array}{l}\n")
# Omit a separating empty line.
if footer[1] != ""
write(io, footer[1], " \\\\\n")
end
for line in footer[2:end]
write(io, line, " \\\\\n")
end
write(io, "\\end{array}\n")
else
for line in footer
write(io, line, "\n")
end
end
end
end

Loading

0 comments on commit b0d2567

Please sign in to comment.