naprawiony problem z uniformizatorem w superelliptic; decomposition_omega8_hpdh dziala

This commit is contained in:
jgarnek 2023-03-24 11:27:05 +00:00
parent 42ccc4d3e9
commit 995d5f02d8
7 changed files with 3618 additions and 35 deletions

File diff suppressed because one or more lines are too long

View File

@ -18,12 +18,14 @@ load('superelliptic_drw/decomposition_into_g0_g8.sage')
load('superelliptic_drw/superelliptic_witt.sage') load('superelliptic_drw/superelliptic_witt.sage')
load('superelliptic_drw/superelliptic_drw_form.sage') load('superelliptic_drw/superelliptic_drw_form.sage')
load('superelliptic_drw/superelliptic_drw_cech.sage') load('superelliptic_drw/superelliptic_drw_cech.sage')
load('superelliptic_drw/superelliptic_drw_auxilliaries.sage')
load('superelliptic_drw/regular_form.sage') load('superelliptic_drw/regular_form.sage')
load('superelliptic_drw/de_rham_witt_lift.sage') load('superelliptic_drw/de_rham_witt_lift.sage')
load('superelliptic_drw/automorphism.sage') load('superelliptic_drw/automorphism.sage')
load('auxilliaries/reverse.sage') load('auxilliaries/reverse.sage')
load('auxilliaries/hensel.sage') load('auxilliaries/hensel.sage')
load('auxilliaries/linear_combination_polynomials.sage') load('auxilliaries/linear_combination_polynomials.sage')
load('auxilliaries/laurent_analytic_part.sage')
############## ##############
############## ##############
load('drafty/convert_superelliptic_into_AS.sage') load('drafty/convert_superelliptic_into_AS.sage')

View File

@ -201,10 +201,22 @@ class superelliptic:
basis += [superelliptic_function(self, Fxy(m*y^(m-j)/x^i))] basis += [superelliptic_function(self, Fxy(m*y^(m-j)/x^i))]
return basis return basis
#Auxilliary. Given a superelliptic curve C : y^m = f(x) and a polynomial g(x, y) def uniformizer(self):
#it replaces repeteadly all y^m's in g(x, y) by f(x). As a result m = self.exponent
#you obtain \sum_{i = 0}^{m-1} y^i g_i(x). r = self.polynomial.degree()
delta, a, b = xgcd(m, r)
a = -a
M = m/delta
R = r/delta
while a<0:
a += R
b += M
return (C.x)^a/(C.y)^b
def reduction(C, g): def reduction(C, g):
'''Auxilliary. Given a superelliptic curve C : y^m = f(x) and a polynomial g(x, y)
it replaces repeteadly all y^m's in g(x, y) by f(x). As a result
you obtain \sum_{i = 0}^{m-1} y^i g_i(x).'''
p = C.characteristic p = C.characteristic
F = C.base_ring F = C.base_ring
Rxy.<x, y> = PolynomialRing(F, 2) Rxy.<x, y> = PolynomialRing(F, 2)

View File

@ -122,13 +122,12 @@ class superelliptic_function:
fct = RxyQ(fct) fct = RxyQ(fct)
r = f.degree() r = f.degree()
delta, a, b = xgcd(m, r) delta, a, b = xgcd(m, r)
b = -b a = -a
M = m/delta M = m/delta
R = r/delta R = r/delta
while a<0: while a<0:
a += R a += R
b += M b += M
g = (x^r*f(x = 1/x)) g = (x^r*f(x = 1/x))
gW = RptWQ(g(x = t^M * W^b)) - W^(delta) gW = RptWQ(g(x = t^M * W^b)) - W^(delta)
ww = naive_hensel(gW, F, start = root_of_unity(F, delta)^place, prec = prec) ww = naive_hensel(gW, F, start = root_of_unity(F, delta)^place, prec = prec)

View File

@ -58,10 +58,3 @@ def decomposition_omega0_omega8(omega, prec=50):
#aux_fct = (g0.form)*y #aux_fct = (g0.form)*y
else: else:
raise ValueError("Something went wrong for "+str(omega) +". Result would be "+str(g0)+ " and " + str(g8)) raise ValueError("Something went wrong for "+str(omega) +". Result would be "+str(g0)+ " and " + str(g8))
def decomposition_g0_g8_pth_power(fct):
'''Decompose fct as g0 - g8 + A^p, if possible. Output: (g0, g8, A).'''
coor = fct.coordinates()
C = fct.curve
return 0

View File

@ -0,0 +1,49 @@
def decomposition_g0_pth_power(fct):
'''Decompose fct as g0 + A^p, if possible. Output: (g0, A).'''
omega = fct.diffn().regular_form()
g0 = omega.int()
A = (fct - g0).pth_root()
return (g0, A)
def decomposition_g0_p2th_power(fct):
'''Decompose fct as g0 + A^(p^2), if possible. Output: (g0, A).'''
g0, A = decomposition_g0_pth_power(fct)
A0, A1 = decomposition_g0_pth_power(A)
return (g0 + A0^p, A1)
def decomposition_omega0_hpdh(omega):
'''Decompose omega = (regular on U0) + h^(p-1) dh, so that Cartier(omega) = (regular on U0) + dh.
Result: (regular on U0, h)'''
omega1 = omega.cartier().cartier()
omega1 = omega1.inv_cartier().inv_cartier()
fct = (omega.cartier() - omega1.cartier()).int()
return (omega1, fct)
def decomposition_omega8_hpdh(omega, prec = 50):
'''Decompose omega = (regular on U8) + h^(p-1) dh, so that Cartier(omega) = (regular on U8) + dh.
Result: (regular on U8, h)'''
C = omega.curve
g = C.genus()
Fxy, Rxy, x, y = C.fct_field
F = C.base_ring
p = C.characteristic
Rt.<t> = LaurentSeriesRing(F)
RT.<T> = PolynomialRing(F)
FT = FractionField(RT)
omega_analytic = FT(laurent_analytic_part(omega.expansion_at_infty(prec = prec))(t = T))
print('omega_analytic', omega_analytic)
Cv = C.uniformizer()
v = Fxy(Cv.function)
omega_analytic = Fxy(omega_analytic(T = v))
print('expansions', superelliptic_function(C, omega_analytic).expansion_at_infty(prec = prec), '\n', Cv.diffn().expansion_at_infty(prec = prec),
'\n', (superelliptic_function(C, omega_analytic)*Cv.diffn()).expansion_at_infty(prec = prec))
omega_analytic = superelliptic_function(C, omega_analytic)*Cv.diffn()
print('omega_analytic.expansion_at_infty()', omega_analytic.expansion_at_infty(prec = prec))
print('omega_analytic', omega_analytic)
omega8 = omega - omega_analytic
print('omega8', omega8)
dh = omega.cartier() - omega8.cartier()
print('dh', dh)
h = dh.int()
print('omega8.expansion_at_infty()', omega8.expansion_at_infty(prec = prec))
return (omega8, h)

View File

@ -67,15 +67,18 @@ class superelliptic_drw_cech:
aux.omega0 -= aux_f_t_0.teichmuller().diffn() aux.omega0 -= aux_f_t_0.teichmuller().diffn()
aux.omega8 = aux.omega0 - aux.f.diffn() aux.omega8 = aux.omega0 - aux.f.diffn()
# #
# Now omega = (regular on U0) + h^(p-1) dh, so that Cartier(omega) = (regular on U0) + dh.
# We replace omega by regular on U0
omega = aux.omega0.omega omega = aux.omega0.omega
omega1 = omega.cartier().cartier() aux.omega0.omega, fct = decomposition_omega0_hpdh(aux.omega0.omega)
omega1 = omega1.inv_cartier().inv_cartier()
fct = (omega.cartier() - omega1.cartier()).int()
aux.omega0.h2 += fct^p aux.omega0.h2 += fct^p
aux.omega0.omega = omega1 # Now we have to ensure that aux.omega0.h2.function in Rxy...
if aux.omega0.h2.function in Rxy: # In other words, we decompose h2 = (regular on U0) + A^(p^2).
aux.omega0.h2 = decomposition_g0_p2th_power(aux.omega0.h2)[0]
# Now we can reduce: (... + dV(h2), V(f), ...) --> (..., V(f - h2), ...)
aux.f -= aux.omega0.h2.verschiebung() aux.f -= aux.omega0.h2.verschiebung()
aux.omega0.h2 = 0*C.x aux.omega0.h2 = 0*C.x
if aux.omega8.h2.expansion_at_infty().valuation() >= 0: if aux.omega8.h2.expansion_at_infty().valuation() >= 0:
aux.f += aux.omega8.h2.verschiebung() aux.f += aux.omega8.h2.verschiebung()
aux.omega8.h2 = 0*C.x aux.omega8.h2 = 0*C.x
@ -88,9 +91,10 @@ class superelliptic_drw_cech:
print('aux.omega0.omega.cartier() - aux.f.f.pth_root().diffn() == aux.omega8.omega.cartier()', aux.omega0.omega.cartier() - aux.f.f.pth_root().diffn() == aux.omega8.omega.cartier()) print('aux.omega0.omega.cartier() - aux.f.f.pth_root().diffn() == aux.omega8.omega.cartier()', aux.omega0.omega.cartier() - aux.f.f.pth_root().diffn() == aux.omega8.omega.cartier())
return aux_divided_by_p return aux_divided_by_p
else: else:
print('aux.omega8.omega', aux.omega8.omega)
print('aux.omega8.h2', aux.omega8.h2)
print('second_patch(aux.omega8.h2.diffn()).is_regular_on_U0()', second_patch(aux.omega8.h2.diffn()).is_regular_on_U0())
raise ValueError("aux.omega8.h2.expansion_at_infty().valuation() < 0:", aux.omega8.h2.expansion_at_infty()) raise ValueError("aux.omega8.h2.expansion_at_infty().valuation() < 0:", aux.omega8.h2.expansion_at_infty())
else:
raise ValueError("aux.omega0.h2.function not in Rxy:", aux.omega0.h2.function)
def coordinates(self, basis = 0): def coordinates(self, basis = 0):
C = self.curve C = self.curve