From 1c44a8d52fa77ed6cc195f410a56c1c15c893d07 Mon Sep 17 00:00:00 2001 From: Martin Wagner Date: Mon, 31 Mar 2025 10:48:29 +0200 Subject: [PATCH 1/4] Improve `generic_cyclotomic_ring` constructor --- src/Exports.jl | 2 + src/GenericCyclotomics.jl | 92 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 89 insertions(+), 5 deletions(-) diff --git a/src/Exports.jl b/src/Exports.jl index a686c4d..25fa5a1 100644 --- a/src/Exports.jl +++ b/src/Exports.jl @@ -20,8 +20,10 @@ export number_of_conjugacy_classes export number_of_parameters export omega export order +export param export parameter export parameters +export params export parent export scalar_product export set_congruence diff --git a/src/GenericCyclotomics.jl b/src/GenericCyclotomics.jl index 53261b2..f75ff52 100644 --- a/src/GenericCyclotomics.jl +++ b/src/GenericCyclotomics.jl @@ -182,10 +182,11 @@ function show(io::IO, ::MIME"text/plain", R::GenericCycloRing) println(io, "over ", base_ring(base_ring(R))) print(io, "dependent on ", join(gens(base_ring(R)), ", ")) if R.congruence !== nothing + q = gen(base_ring(R), 1)^R.power print( io, "\nwhere ", - gen(base_ring(R), 1), + q, " is congruent to ", R.congruence[1], " modulo ", @@ -489,18 +490,60 @@ end # Parent constructor -# TODO Maybe don't require at least one variable? +@doc raw""" + generic_cyclotomic_ring(symbol::Symbol=:E; congruence::Union{Tuple{ZZRingElem,ZZRingElem},Nothing}=nothing, variable::Symbol=:q, power::Int64=1, cached::Bool=true) + +Return a tuple consisting of the generic cyclotomic ring `S` with the main variable `variable`, +a generic root generator `E` and the parameter `q` corresponding to the symbol `variable`. +The symbol `symbol` is used as a compact placeholder for $e^{2 \pi i}$ for printing. +In the simplification process of the elements of `S` it is assumed that `q` to the power of `power` +always represents a whole number cungruent to `congruence[1]` modulo `congruence[2]`. + +Currently the optional argument `cached` is ignored. + +!!! warning + In the exponents of the generic cyclotomic numbers `q` may only occur in powers which are a multiple of `power`. + Otherwise the simplification will return false results. + +# Examples +```jldoctest +julia> S, E, q = generic_cyclotomic_ring() +(Generic cyclotomic ring over Rational field, Generator of Generic cyclotomic ring over Rational field, q) + +julia> E(q-1)^(q-1) +1 + +julia> E(3)^2 +-E(3) - 1 + +julia> S, E, q = generic_cyclotomic_ring(congruence=(ZZ(1),ZZ(3)), power=2) +(Generic cyclotomic ring over Rational field, Generator of Generic cyclotomic ring over Rational field, q) + +julia> S +Generic cyclotomic ring + over Rational field + dependent on q + where q^2 is congruent to 1 modulo 3 + +julia> E(3)^(q^2-1) +1 + +julia> E(3)^(q^2) +E(3) + +``` +""" function generic_cyclotomic_ring( - R::UPolyRing, symbol::Symbol=:E; congruence::Union{Tuple{ZZRingElem,ZZRingElem},Nothing}=nothing, + variable::Symbol=:q, power::Int64=1, cached::Bool=true, ) + R, (q,) = universal_polynomial_ring(QQ, [variable]; cached=false) S = GenericCycloRing(R, symbol, congruence, power) E = GenericCycloRingGen(S) - length(gens(R)) < 1 && error("At least one free variable is needed") - return (S, E) + return (S, E, q) end function (E::GenericCycloRingGen)(order::RingElement) @@ -509,6 +552,45 @@ function (E::GenericCycloRingGen)(order::RingElement) return S(Dict(R(1)//R(order) => R(1))) end +# Create parameters + +@doc raw""" + param(S::GenericCycloRing, var::Symbol) + +Return the parameter of `S` corresponding to the symbol `var`. If there is no such paramter it creates a new one. + +# Examples +```jldoctest +julia> S, E, q = generic_cyclotomic_ring() +(Generic cyclotomic ring over Rational field, Generator of Generic cyclotomic ring over Rational field, q) + +julia> param(S, :q) +q + +julia> param(S, :i) +i + +``` +""" +param(S::GenericCycloRing, var::Symbol) = gen(base_ring(S), var) + +@doc raw""" + params(S::GenericCycloRing, vars::Vector{Symbol}) + +Return the parameters of `S` corresponding to the symbols `vars`. If any of those is missing create a new one. + +# Examples +```jldoctest +julia> S, E, q = generic_cyclotomic_ring() +(Generic cyclotomic ring over Rational field, Generator of Generic cyclotomic ring over Rational field, q) + +julia> params(S, [:q, :i]) +(q, i) + +``` +""" +params(S::GenericCycloRing, vars::Vector{Symbol}) = gens(base_ring(S), vars) + # congruence computation function get_substitutes!(R::GenericCycloRing) congruence = R.congruence From 072bd85afa254fe1ac05a6ace5e897ddce8cacf8 Mon Sep 17 00:00:00 2001 From: Martin Wagner Date: Mon, 31 Mar 2025 10:56:57 +0200 Subject: [PATCH 2/4] Fix tables --- data/Tables/2A2/GU3.jl | 9 ++++----- data/Tables/2A2/PGU3.2.jl | 9 ++++----- data/Tables/2A2/PSU3.2.jl | 9 ++++----- data/Tables/2A2/SU3.2.jl | 9 ++++----- data/Tables/2A2/SU3.n2.jl | 9 ++++----- data/Tables/2B2/2B2.jl | 9 ++++----- data/Tables/2F4/2F4.1.jl | 9 ++++----- data/Tables/2F4/2F4.2.jl | 9 ++++----- data/Tables/2G2/2G2.jl | 9 ++++----- data/Tables/3D4/3D4.0.jl | 9 ++++----- data/Tables/3D4/3D4.11.jl | 9 ++++----- data/Tables/3D4/3D4.13.jl | 9 ++++----- data/Tables/A1/GL2.jl | 9 ++++----- data/Tables/A1/GU2.jl | 9 ++++----- data/Tables/A1/PGL2.1.jl | 9 ++++----- data/Tables/A1/PSL2.1.jl | 9 ++++----- data/Tables/A1/PSL2.3.jl | 9 ++++----- data/Tables/A1/SL2.0.jl | 9 ++++----- data/Tables/A1/SL2.1.jl | 9 ++++----- data/Tables/A2/GL3.jl | 9 ++++----- data/Tables/A2/PGL3.1.jl | 9 ++++----- data/Tables/A2/PSL3.1.jl | 9 ++++----- data/Tables/A2/SL3.1.jl | 9 ++++----- data/Tables/A2/SL3.n1.jl | 9 ++++----- data/Tables/C2/Sp4.0.jl | 9 ++++----- data/Tables/C3/CSp6.1.jl | 9 ++++----- data/Tables/C3/Sp6.0.jl | 9 ++++----- data/Tables/F4/uniuniF4p2.jl | 5 ++--- data/Tables/G2/G2.01.jl | 9 ++++----- data/Tables/G2/G2.02.jl | 9 ++++----- data/Tables/G2/G2.101.jl | 9 ++++----- data/Tables/G2/G2.103.jl | 9 ++++----- data/Tables/G2/G2.111.jl | 9 ++++----- data/Tables/G2/G2.113.jl | 9 ++++----- data/Tables/G2/G2.121.jl | 9 ++++----- data/Tables/G2/G2.123.jl | 9 ++++----- src/GenericCyclotomics.jl | 2 ++ 37 files changed, 144 insertions(+), 178 deletions(-) diff --git a/data/Tables/2A2/GU3.jl b/data/Tables/2A2/GU3.jl index b977d17..32e7d0b 100644 --- a/data/Tables/2A2/GU3.jl +++ b/data/Tables/2A2/GU3.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R) -k, l, m, u, v, w, _... = gens( - R, +S, E, q = generic_cyclotomic_ring() +R = base_ring(S) +k, l, m, u, v, w, _... = params( + S, [ "k", "l", diff --git a/data/Tables/2A2/PGU3.2.jl b/data/Tables/2A2/PGU3.2.jl index 86ad73a..b9f5cca 100644 --- a/data/Tables/2A2/PGU3.2.jl +++ b/data/Tables/2A2/PGU3.2.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((-1, 3))) -k, l, u, v, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((-1, 3))) +R = base_ring(S) +k, l, u, v, _... = params( + S, [ "k", "l", diff --git a/data/Tables/2A2/PSU3.2.jl b/data/Tables/2A2/PSU3.2.jl index 55ca62d..641836d 100644 --- a/data/Tables/2A2/PSU3.2.jl +++ b/data/Tables/2A2/PSU3.2.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((-1, 3))) -a, b, m, n, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((-1, 3))) +R = base_ring(S) +a, b, m, n, _... = params( + S, [ "a", "b", diff --git a/data/Tables/2A2/SU3.2.jl b/data/Tables/2A2/SU3.2.jl index ff6632a..0e595e1 100644 --- a/data/Tables/2A2/SU3.2.jl +++ b/data/Tables/2A2/SU3.2.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((-1, 3))) -a, b, m, n, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((-1, 3))) +R = base_ring(S) +a, b, m, n, _... = params( + S, [ "a", "b", diff --git a/data/Tables/2A2/SU3.n2.jl b/data/Tables/2A2/SU3.n2.jl index 17f55cf..f35d9c8 100644 --- a/data/Tables/2A2/SU3.n2.jl +++ b/data/Tables/2A2/SU3.n2.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R) -a, b, m, n, _... = gens( - R, +S, E, q = generic_cyclotomic_ring() +R = base_ring(S) +a, b, m, n, _... = params( + S, [ "a", "b", diff --git a/data/Tables/2B2/2B2.jl b/data/Tables/2B2/2B2.jl index 0e7c24e..8764937 100644 --- a/data/Tables/2B2/2B2.jl +++ b/data/Tables/2B2/2B2.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q0 = gen(R, "q0") -S, E = generic_cyclotomic_ring(R) -a, b, c, s, k, u, _... = gens( - R, +S, E, q0 = generic_cyclotomic_ring() +R = base_ring(S) +a, b, c, s, k, u, _... = params( + S, [ "a", "b", diff --git a/data/Tables/2F4/2F4.1.jl b/data/Tables/2F4/2F4.1.jl index e413df3..1be78de 100644 --- a/data/Tables/2F4/2F4.1.jl +++ b/data/Tables/2F4/2F4.1.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q0 = gen(R, "q0") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((1, 3))) -a, b, k, l, _... = gens( - R, +S, E, q0 = generic_cyclotomic_ring(; congruence=ZZ.((1, 3))) +R = base_ring(S) +a, b, k, l, _... = params( + S, [ "a", "b", diff --git a/data/Tables/2F4/2F4.2.jl b/data/Tables/2F4/2F4.2.jl index 0705a6f..fd4dcd3 100644 --- a/data/Tables/2F4/2F4.2.jl +++ b/data/Tables/2F4/2F4.2.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q0 = gen(R, "q0") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((-1, 3))) -a, b, k, l, _... = gens( - R, +S, E, q0 = generic_cyclotomic_ring(; congruence=ZZ.((-1, 3))) +R = base_ring(S) +a, b, k, l, _... = params( + S, [ "a", "b", diff --git a/data/Tables/2G2/2G2.jl b/data/Tables/2G2/2G2.jl index 783616c..e6155bc 100644 --- a/data/Tables/2G2/2G2.jl +++ b/data/Tables/2G2/2G2.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q0 = gen(R, "q0") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((-1, 4))) -i, j, k, l, _... = gens( - R, +S, E, q0 = generic_cyclotomic_ring(; congruence=ZZ.((-1, 4))) +R = base_ring(S) +i, j, k, l, _... = params( + S, [ "i", "j", diff --git a/data/Tables/3D4/3D4.0.jl b/data/Tables/3D4/3D4.0.jl index 5b97094..932d28f 100644 --- a/data/Tables/3D4/3D4.0.jl +++ b/data/Tables/3D4/3D4.0.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R) -a, b, k, l, _... = gens( - R, +S, E, q = generic_cyclotomic_ring() +R = base_ring(S) +a, b, k, l, _... = params( + S, [ "a", "b", diff --git a/data/Tables/3D4/3D4.11.jl b/data/Tables/3D4/3D4.11.jl index 599c21a..8826581 100644 --- a/data/Tables/3D4/3D4.11.jl +++ b/data/Tables/3D4/3D4.11.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((1, 4))) -a, b, k, l, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((1, 4))) +R = base_ring(S) +a, b, k, l, _... = params( + S, [ "a", "b", diff --git a/data/Tables/3D4/3D4.13.jl b/data/Tables/3D4/3D4.13.jl index 1efc09a..cef1be0 100644 --- a/data/Tables/3D4/3D4.13.jl +++ b/data/Tables/3D4/3D4.13.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((-1, 4))) -a, b, k, l, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((-1, 4))) +R = base_ring(S) +a, b, k, l, _... = params( + S, [ "a", "b", diff --git a/data/Tables/A1/GL2.jl b/data/Tables/A1/GL2.jl index 6a52bf4..b599565 100644 --- a/data/Tables/A1/GL2.jl +++ b/data/Tables/A1/GL2.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R) -i, j, l, k, _... = gens( - R, +S, E, q = generic_cyclotomic_ring() +R = base_ring(S) +i, j, l, k, _... = params( + S, [ "i", "j", diff --git a/data/Tables/A1/GU2.jl b/data/Tables/A1/GU2.jl index e71e6fa..5a069e5 100644 --- a/data/Tables/A1/GU2.jl +++ b/data/Tables/A1/GU2.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R) -k, l, u, v, _... = gens( - R, +S, E, q = generic_cyclotomic_ring() +R = base_ring(S) +k, l, u, v, _... = params( + S, [ "k", "l", diff --git a/data/Tables/A1/PGL2.1.jl b/data/Tables/A1/PGL2.1.jl index 7dc9a4a..75ad78f 100644 --- a/data/Tables/A1/PGL2.1.jl +++ b/data/Tables/A1/PGL2.1.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((1, 2))) -i, j, l, k, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((1, 2))) +R = base_ring(S) +i, j, l, k, _... = params( + S, [ "i", "j", diff --git a/data/Tables/A1/PSL2.1.jl b/data/Tables/A1/PSL2.1.jl index 378baac..71a7435 100644 --- a/data/Tables/A1/PSL2.1.jl +++ b/data/Tables/A1/PSL2.1.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((1, 4))) -i, k, _... = gens( - R, ["i", "k", "i1", "k1", "i2", "k2", "i3", "k3", "it1", "kt1", "it2", "kt2"] +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((1, 4))) +R = base_ring(S) +i, k, _... = params( + S, ["i", "k", "i1", "k1", "i2", "k2", "i3", "k3", "it1", "kt1", "it2", "kt2"] ) order = q^2 * (q^2 - 1) * (q^2 + 1) * 1//2 diff --git a/data/Tables/A1/PSL2.3.jl b/data/Tables/A1/PSL2.3.jl index 4695ab7..0e0616f 100644 --- a/data/Tables/A1/PSL2.3.jl +++ b/data/Tables/A1/PSL2.3.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((-1, 4))) -i, k, _... = gens( - R, ["i", "k", "i1", "k1", "i2", "k2", "i3", "k3", "it1", "kt1", "it2", "kt2"] +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((-1, 4))) +R = base_ring(S) +i, k, _... = params( + S, ["i", "k", "i1", "k1", "i2", "k2", "i3", "k3", "it1", "kt1", "it2", "kt2"] ) order = q^2 * (q^2 - 1) * (q^2 + 1) * 1//2 diff --git a/data/Tables/A1/SL2.0.jl b/data/Tables/A1/SL2.0.jl index 6419d56..a04069c 100644 --- a/data/Tables/A1/SL2.0.jl +++ b/data/Tables/A1/SL2.0.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((0, 2))) -a, n, _... = gens( - R, ["a", "n", "a1", "n1", "a2", "n2", "a3", "n3", "at1", "nt1", "at2", "nt2"] +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((0, 2))) +R = base_ring(S) +a, n, _... = params( + S, ["a", "n", "a1", "n1", "a2", "n2", "a3", "n3", "at1", "nt1", "at2", "nt2"] ) order = q * (q - 1) * (q + 1) diff --git a/data/Tables/A1/SL2.1.jl b/data/Tables/A1/SL2.1.jl index d864c0b..1a36bb5 100644 --- a/data/Tables/A1/SL2.1.jl +++ b/data/Tables/A1/SL2.1.jl @@ -2,12 +2,11 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q0 = gen(R, "q0") +S, E, q0 = generic_cyclotomic_ring(; congruence=ZZ.((1, 2)), power=2) +R = base_ring(S) q = q0^2 -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((1, 2)), power=2) -i, k, _... = gens( - R, ["i", "k", "i1", "k1", "i2", "k2", "i3", "k3", "it1", "kt1", "it2", "kt2"] +i, k, _... = params( + S, ["i", "k", "i1", "k1", "i2", "k2", "i3", "k3", "it1", "kt1", "it2", "kt2"] ) order = q * (q - 1) * (q + 1) diff --git a/data/Tables/A2/GL3.jl b/data/Tables/A2/GL3.jl index 9cec068..947aed2 100644 --- a/data/Tables/A2/GL3.jl +++ b/data/Tables/A2/GL3.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R) -a, b, c, l, m, n, _... = gens( - R, +S, E, q = generic_cyclotomic_ring() +R = base_ring(S) +a, b, c, l, m, n, _... = params( + S, [ "a", "b", diff --git a/data/Tables/A2/PGL3.1.jl b/data/Tables/A2/PGL3.1.jl index b6384a8..aa32f85 100644 --- a/data/Tables/A2/PGL3.1.jl +++ b/data/Tables/A2/PGL3.1.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((1, 3))) -a, b, m, n, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((1, 3))) +R = base_ring(S) +a, b, m, n, _... = params( + S, [ "a", "b", diff --git a/data/Tables/A2/PSL3.1.jl b/data/Tables/A2/PSL3.1.jl index 271e9e0..69f6216 100644 --- a/data/Tables/A2/PSL3.1.jl +++ b/data/Tables/A2/PSL3.1.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((1, 3))) -a, b, m, n, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((1, 3))) +R = base_ring(S) +a, b, m, n, _... = params( + S, [ "a", "b", diff --git a/data/Tables/A2/SL3.1.jl b/data/Tables/A2/SL3.1.jl index 55b9aa9..e3dd06d 100644 --- a/data/Tables/A2/SL3.1.jl +++ b/data/Tables/A2/SL3.1.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((1, 3))) -a, b, m, n, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((1, 3))) +R = base_ring(S) +a, b, m, n, _... = params( + S, [ "a", "b", diff --git a/data/Tables/A2/SL3.n1.jl b/data/Tables/A2/SL3.n1.jl index 85f3eed..b4122b6 100644 --- a/data/Tables/A2/SL3.n1.jl +++ b/data/Tables/A2/SL3.n1.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R) -a, b, m, n, _... = gens( - R, +S, E, q = generic_cyclotomic_ring() +R = base_ring(S) +a, b, m, n, _... = params( + S, [ "a", "b", diff --git a/data/Tables/C2/Sp4.0.jl b/data/Tables/C2/Sp4.0.jl index 67ff92f..188faf9 100644 --- a/data/Tables/C2/Sp4.0.jl +++ b/data/Tables/C2/Sp4.0.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((0, 2))) -i, j, k, l, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((0, 2))) +R = base_ring(S) +i, j, k, l, _... = params( + S, [ "i", "j", diff --git a/data/Tables/C3/CSp6.1.jl b/data/Tables/C3/CSp6.1.jl index 6633af4..6bb2237 100644 --- a/data/Tables/C3/CSp6.1.jl +++ b/data/Tables/C3/CSp6.1.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((1, 2))) -i1, i2, i3, i4, k1, k2, k3, k4, i11, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((1, 2))) +R = base_ring(S) +i1, i2, i3, i4, k1, k2, k3, k4, i11, _... = params( + S, [ "i1", "i2", diff --git a/data/Tables/C3/Sp6.0.jl b/data/Tables/C3/Sp6.0.jl index 27de866..e29a344 100644 --- a/data/Tables/C3/Sp6.0.jl +++ b/data/Tables/C3/Sp6.0.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((0, 2))) -i1, i2, i3, k1, k2, k3, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((0, 2))) +R = base_ring(S) +i1, i2, i3, k1, k2, k3, _... = params( + S, [ "i1", "i2", diff --git a/data/Tables/F4/uniuniF4p2.jl b/data/Tables/F4/uniuniF4p2.jl index e081e4b..752759a 100644 --- a/data/Tables/F4/uniuniF4p2.jl +++ b/data/Tables/F4/uniuniF4p2.jl @@ -2,9 +2,8 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R) +S, E, q = generic_cyclotomic_ring() +R = base_ring(S) order = q^24 * (q^4 - q^2 + 1) * (q^4 + 1) * (q^2 + q + 1)^2 * (q^2 - q + 1)^2 * (q^2 + 1)^2 * diff --git a/data/Tables/G2/G2.01.jl b/data/Tables/G2/G2.01.jl index 6d4230e..86cd08a 100644 --- a/data/Tables/G2/G2.01.jl +++ b/data/Tables/G2/G2.01.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((1, 3))) -i, j, k, l, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((1, 3))) +R = base_ring(S) +i, j, k, l, _... = params( + S, [ "i", "j", diff --git a/data/Tables/G2/G2.02.jl b/data/Tables/G2/G2.02.jl index 5a23abf..d0ec369 100644 --- a/data/Tables/G2/G2.02.jl +++ b/data/Tables/G2/G2.02.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((-1, 3))) -i, j, k, l, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((-1, 3))) +R = base_ring(S) +i, j, k, l, _... = params( + S, [ "i", "j", diff --git a/data/Tables/G2/G2.101.jl b/data/Tables/G2/G2.101.jl index 2af7a4d..0ad8718 100644 --- a/data/Tables/G2/G2.101.jl +++ b/data/Tables/G2/G2.101.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((1, 4))) -i, j, k, l, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((1, 4))) +R = base_ring(S) +i, j, k, l, _... = params( + S, [ "i", "j", diff --git a/data/Tables/G2/G2.103.jl b/data/Tables/G2/G2.103.jl index 803eca7..27f79a4 100644 --- a/data/Tables/G2/G2.103.jl +++ b/data/Tables/G2/G2.103.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((-1, 4))) -i, j, k, l, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((-1, 4))) +R = base_ring(S) +i, j, k, l, _... = params( + S, [ "i", "j", diff --git a/data/Tables/G2/G2.111.jl b/data/Tables/G2/G2.111.jl index 1138d8b..6fa2ca2 100644 --- a/data/Tables/G2/G2.111.jl +++ b/data/Tables/G2/G2.111.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((1, 12))) -i, j, k, l, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((1, 12))) +R = base_ring(S) +i, j, k, l, _... = params( + S, [ "i", "j", diff --git a/data/Tables/G2/G2.113.jl b/data/Tables/G2/G2.113.jl index 47719e8..4afd9eb 100644 --- a/data/Tables/G2/G2.113.jl +++ b/data/Tables/G2/G2.113.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((7, 12))) -i, j, k, l, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((7, 12))) +R = base_ring(S) +i, j, k, l, _... = params( + S, [ "i", "j", diff --git a/data/Tables/G2/G2.121.jl b/data/Tables/G2/G2.121.jl index 5fa2262..a69ee4e 100644 --- a/data/Tables/G2/G2.121.jl +++ b/data/Tables/G2/G2.121.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((-7, 12))) -i, j, k, l, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((-7, 12))) +R = base_ring(S) +i, j, k, l, _... = params( + S, [ "i", "j", diff --git a/data/Tables/G2/G2.123.jl b/data/Tables/G2/G2.123.jl index 964e25d..8c08993 100644 --- a/data/Tables/G2/G2.123.jl +++ b/data/Tables/G2/G2.123.jl @@ -2,11 +2,10 @@ using ..GenericCharacterTables import ..GenericCharacterTables: Parameters, Parameter, CharTable, GenericCyclo, GenericCycloFrac, nesum using ..GenericCharacterTables.Oscar -R = universal_polynomial_ring(QQ; cached=false) -q = gen(R, "q") -S, E = generic_cyclotomic_ring(R; congruence=ZZ.((-1, 12))) -i, j, k, l, _... = gens( - R, +S, E, q = generic_cyclotomic_ring(; congruence=ZZ.((-1, 12))) +R = base_ring(S) +i, j, k, l, _... = params( + S, [ "i", "j", diff --git a/src/GenericCyclotomics.jl b/src/GenericCyclotomics.jl index f75ff52..1328232 100644 --- a/src/GenericCyclotomics.jl +++ b/src/GenericCyclotomics.jl @@ -576,6 +576,7 @@ param(S::GenericCycloRing, var::Symbol) = gen(base_ring(S), var) @doc raw""" params(S::GenericCycloRing, vars::Vector{Symbol}) + params(S::GenericCycloRing, vars::Vector{String}) Return the parameters of `S` corresponding to the symbols `vars`. If any of those is missing create a new one. @@ -590,6 +591,7 @@ julia> params(S, [:q, :i]) ``` """ params(S::GenericCycloRing, vars::Vector{Symbol}) = gens(base_ring(S), vars) +params(S::GenericCycloRing, vars::Vector{String}) = gens(base_ring(S), vars) # congruence computation function get_substitutes!(R::GenericCycloRing) From a3cc5d0405b8d280013f982c3701705fd92fb70d Mon Sep 17 00:00:00 2001 From: Martin Wagner Date: Mon, 31 Mar 2025 11:49:38 +0200 Subject: [PATCH 3/4] Fix tests --- src/Congruence.jl | 11 ++++++----- src/SumProc.jl | 16 ++++++---------- src/Types.jl | 19 ++++--------------- test/runtests.jl | 15 +++++---------- 4 files changed, 21 insertions(+), 40 deletions(-) diff --git a/src/Congruence.jl b/src/Congruence.jl index b30817a..af6210b 100644 --- a/src/Congruence.jl +++ b/src/Congruence.jl @@ -7,14 +7,15 @@ Return a new generic character table based on `x` where the main parameter is ad `congruence[2]`. So the entries of `x` can potentially be simplified further. """ function set_congruence(x::CharTable, congruence::Tuple{ZZRingElem,ZZRingElem}) - if x.ring.congruence === nothing + R = x.ring + if R.congruence === nothing remainder, modulus = congruence else - remainder = crt(congruence..., x.ring.congruence...) - modulus = lcm(congruence[2], x.ring.congruence[2]) + remainder = crt(congruence..., R.congruence...) + modulus = lcm(congruence[2], R.congruence[2]) end - # The coercion of `GnericCharacter` relies on `base_ring(S) == base_ring(x.ring)` - S, E = generic_cyclotomic_ring(base_ring(x.ring); congruence=(remainder, modulus)) + # The coercion of `GenericCharacter` relies on `base_ring(S) == base_ring(R)` + S = GenericCycloRing(base_ring(R), R.symbol, (remainder, modulus), R.power) t = typeof(x)( x.order, deepcopy(x.classinfo), diff --git a/src/SumProc.jl b/src/SumProc.jl index 23e4bc4..170b05c 100644 --- a/src/SumProc.jl +++ b/src/SumProc.jl @@ -7,13 +7,11 @@ If `vars` is `Vector{Int64}`, then `vars[i]` represents the index of the variabl # Examples ```jldoctest -julia> R = universal_polynomial_ring(QQ; cached=false); +julia> S, E, q = generic_cyclotomic_ring(); -julia> q = gen(R, "q"); +julia> R = base_ring(S); -julia> S, E = generic_cyclotomic_ring(R); - -julia> i, j, k, l = gens(R, ["i", "j", "k", "l"]); +julia> i, j, k, l = params(S, [:i, :j, :k, :l]); julia> a = S(Dict(2//(q-1)*i*j+1//q*k^2+1//2*i*l => R(1))) E(2*q^2 - 2*q)^(q^2*i*l + 4*q*i*j - q*i*l + 2*q*k^2 - 2*k^2) @@ -35,13 +33,11 @@ an exception will be thrown. # Examples ```jldoctest -julia> R = universal_polynomial_ring(QQ; cached=false); - -julia> q = gen(R, "q"); +julia> S, E, q = generic_cyclotomic_ring(); -julia> S, E = generic_cyclotomic_ring(R); +julia> R = base_ring(S); -julia> i, = gens(R, ["i"]); +julia> i = param(S, :i); julia> a = S(Dict(1//(q-1)*i => R(1))) E(q - 1)^i diff --git a/src/Types.jl b/src/Types.jl index d7ec5cb..bd39f68 100644 --- a/src/Types.jl +++ b/src/Types.jl @@ -11,12 +11,9 @@ The ring of generic cyclotomic numbers. # Examples ```jldoctest -julia> R = universal_polynomial_ring(QQ; cached=false); +julia> S, E, q = generic_cyclotomic_ring() +(Generic cyclotomic ring over Rational field, Generator of Generic cyclotomic ring over Rational field, q) -julia> q = gen(R, "q"); - -julia> S, E = generic_cyclotomic_ring(R) -(Generic cyclotomic ring over Rational field, Generator of Generic cyclotomic ring over Rational field) ``` """ mutable struct GenericCycloRing <: Ring @@ -47,11 +44,7 @@ The type for generic cyclotomic numbers. # Examples ```jldoctest -julia> R = universal_polynomial_ring(QQ; cached=false); - -julia> q = gen(R, "q"); - -julia> S, E = generic_cyclotomic_ring(R); +julia> S, E, q = generic_cyclotomic_ring(); julia> S(q; exponent=1//(q-1)) q*E(q - 1) @@ -87,11 +80,7 @@ The type for fractions of generic cyclotomic numbers. # Examples ```jldoctest -julia> R = universal_polynomial_ring(QQ; cached=false); - -julia> q = gen(R, "q"); - -julia> S, E = generic_cyclotomic_ring(R); +julia> S, E, q = generic_cyclotomic_ring(); julia> a = S(q; exponent=1//(q-1)) q*E(q - 1) diff --git a/test/runtests.jl b/test/runtests.jl index ee0154a..e58900b 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -5,25 +5,20 @@ using Test include("Aqua.jl") @testset "Conformance tests" begin - R = universal_polynomial_ring(QQ) - q, i, j = gens(R, ["q", "i", "j"]) - S, E = generic_cyclotomic_ring(R) + S, E, q = generic_cyclotomic_ring() + i, j = params(S, [:i, :j]) ConformanceTests.test_Ring_interface(S) end @testset "GenericCyclo" begin - R = universal_polynomial_ring(QQ) - q, i, j = gens(R, [:q, :i, :j]) - S, E = generic_cyclotomic_ring(R) - S1, E = generic_cyclotomic_ring(R) + S, E, q = generic_cyclotomic_ring() + i, j = params(S, [:i, :j]) + R = base_ring(S) a = S(Dict(1//(q - 1) * i + 2//(q - 1) * j + q^2//(q + 1) * i => R(1))) b = S(Dict(2 * q//(q^2 - 1) * i + 2//(q - 1) * j => R(1))) @test a == b - b1 = S1(Dict(2 * q//(q^2 - 1) * i + 2//(q - 1) * j => R(1))) - @test b != b1 - c = S(Dict(1//q * j => R(1))) @test (a + c) == (c + a) @test iszero(-c + c) From ca2e5c2d0c0dc6ce5d7165e92355415e58de6f80 Mon Sep 17 00:00:00 2001 From: Martin Wagner Date: Tue, 1 Apr 2025 16:14:53 +0200 Subject: [PATCH 4/4] Update src/GenericCyclotomics.jl Co-authored-by: Max Horn --- src/GenericCyclotomics.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GenericCyclotomics.jl b/src/GenericCyclotomics.jl index 1328232..599f95a 100644 --- a/src/GenericCyclotomics.jl +++ b/src/GenericCyclotomics.jl @@ -503,7 +503,7 @@ Currently the optional argument `cached` is ignored. !!! warning In the exponents of the generic cyclotomic numbers `q` may only occur in powers which are a multiple of `power`. - Otherwise the simplification will return false results. + Otherwise the simplification may return incorrect results. # Examples ```jldoctest