Skip to content

Commit

Permalink
Fixes Serre (improves #1428) (#1617)
Browse files Browse the repository at this point in the history
* Fixes Serre (improves #1428)

Given an element of norm 1, Hilbert 90 assures it can be written as
sigma(x)/x
Generically, this is solves via Lagrage resolvent and randomization.
(frobenius_equation). If this fails, a much slower method is called\that
constructs the element digit-by-digit (frobenius_equation2).
The 1st function has to increase (temporarily) the precision. However
then the norm 1 condition is no longer true... and thus the input for
the second function illegal hence the failure.
  • Loading branch information
fieker authored Sep 20, 2024
1 parent 38aab56 commit d9b7787
Showing 1 changed file with 15 additions and 5 deletions.
20 changes: 15 additions & 5 deletions src/LocalField/neq.jl
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,8 @@ end
Find an element `x` in `parent(c)` such that `frobenius(x, d) = x*c`.
If the norm of `c` is one, this is supposed to work.
(Hilbert 90)
"""
function frobenius_equation(d::Int, c::FinFieldElem)
F = parent(c)
Expand Down Expand Up @@ -520,6 +522,7 @@ end
artin_schreier_equation(d::Int, c::Union{fpFieldElem, fqPolyRepFieldElem})
Find an element `x` in `parent(c)` such that `frobenius(x, d) -x = c`.
Additive Hilbert 90.
"""
function artin_schreier_equation(d::Int, c::FinFieldElem)
F = parent(c)
Expand Down Expand Up @@ -587,7 +590,11 @@ end
"""
solve, hopefully,
x^phi//x = c
for phi the frobenius of parent(c) over F
for phi the Frobenius of parent(c) over F
Requires norm(c) == 1 for the norm relative to the Frobenius
(multiplicative Hilbert 90)
"""
function frobenius_equation(c::Hecke.LocalFieldElem, F::Union{PadicField, QadicField, Hecke.LocalField}; frobenius = false)
E = parent(c)
Expand Down Expand Up @@ -618,7 +625,9 @@ function frobenius_equation(c::Hecke.LocalFieldElem, F::Union{PadicField, QadicF

v_deg = valuation(absolute_degree(E), prime(E))
setprecision(E, precision(E) + v_deg) do
c = setprecision(c, precision(E))
cd = setprecision(c, precision(E))
#careful: the function only works if norm(c) == 1
#increasing the precision will break this
cnt = 0
while true
local gamma
Expand All @@ -632,7 +641,7 @@ function frobenius_equation(c::Hecke.LocalFieldElem, F::Union{PadicField, QadicF
a = zero(E)
for i=1:divexact(absolute_degree(E), absolute_degree(F))
a += b
b = c*fr(b)
b = cd*fr(b)
end
iszero(a) && continue
va = valuation(a)
Expand Down Expand Up @@ -767,13 +776,12 @@ function local_fundamental_class_serre(mKL::LocalFieldMor)
@assert valuation(u) == 0
v = norm_equation(E, u)
@assert valuation(v) == 0
global last_neq = (E, u, v)
@assert norm(v) == u
pi = v*uniformizer(L)
pi_inv = inv(pi)

#if (like here) L is Eisenstein over unram, then the automorphisms are easier
global last_mKL = mKL

if ramification_index(L) == degree(L) && e > 1#so we're ramified
#thus Gal(E/base_field(L)) = Gal(L/base_field(L)) x unram of base_field
bL = base_field(L)
Expand Down Expand Up @@ -870,6 +878,8 @@ function local_fundamental_class_serre(mKL::LocalFieldMor)

c = GG[fa[fb[1]]](pi) * pi_inv

# @assert isone(norm(c))

us = frobenius_equation(c, K, frobenius = fr)
#think...
@assert fr(us) == c*us || valuation(fr(us) - c*us) >= precision(c)//absolute_ramification_index(E)
Expand Down

0 comments on commit d9b7787

Please sign in to comment.