naprawione regular form; superelliptyczne maja C.x_series itd

This commit is contained in:
jgarnek 2023-03-30 15:49:22 +00:00
parent eda1cca0c2
commit 64fe2ee228
10 changed files with 6605 additions and 33234 deletions

File diff suppressed because one or more lines are too long

View File

@ -1,14 +1,14 @@
p = 5 p = 5
m = 2 m = 2
F = GF(p) F = GF(p)
Rx.<x> = PolynomialRing(F) Rxx.<x> = PolynomialRing(F)
#f = (x^3 - x)^3 + x^3 - x #f = (x^3 - x)^3 + x^3 - x
f = x^3 + x f = x^3 + x
f1 = f(x = x^5 - x) f1 = f(x = x^5 - x)
C = superelliptic(f, m) C = superelliptic(f, m)
C1 = superelliptic(f1, m) C1 = superelliptic(f1, m, prec = 500)
B = C.crystalline_cohomology_basis(prec = 100, info = 1) B = C.crystalline_cohomology_basis(prec = 100, info = 1)
B1 = C1.crystalline_cohomology_basis(prec = 500, info = 1) B1 = C1.crystalline_cohomology_basis(prec = 100, info = 1)
def crystalline_matrix(C, prec = 50): def crystalline_matrix(C, prec = 50):
B = C.crystalline_cohomology_basis(prec = prec) B = C.crystalline_cohomology_basis(prec = prec)
@ -20,6 +20,12 @@ def crystalline_matrix(C, prec = 50):
M[i, :] = vector(autom(b).coordinates(basis = B)) M[i, :] = vector(autom(b).coordinates(basis = B))
return M return M
for b in B:
print(b.regular_form())
for b in B1:
print(b.regular_form())
#M = crystalline_matrix(C, prec = 150) #M = crystalline_matrix(C, prec = 150)
#print(M) #print(M)
#print(M^3) #print(M^3)

View File

@ -1,7 +1,7 @@
class superelliptic: class superelliptic:
"""Class of a superelliptic curve. Given a polynomial f(x) with coefficient field F, it constructs """Class of a superelliptic curve. Given a polynomial f(x) with coefficient field F, it constructs
the curve y^m = f(x)""" the curve y^m = f(x)"""
def __init__(self, f, m): def __init__(self, f, m, prec = 100):
Rx = f.parent() Rx = f.parent()
x = Rx.gen() x = Rx.gen()
F = Rx.base() F = Rx.base()
@ -20,6 +20,31 @@ class superelliptic:
self.y = superelliptic_function(self, Rxy(y)) self.y = superelliptic_function(self, Rxy(y))
self.dx = superelliptic_form(self, Rxy(1)) self.dx = superelliptic_form(self, Rxy(1))
self.one = superelliptic_function(self, Rxy(1)) self.one = superelliptic_function(self, Rxy(1))
# We compute now expansions at infinity of x and y.
Rt.<t> = LaurentSeriesRing(F, default_prec=prec)
RptW.<W> = PolynomialRing(Rt)
RptWQ = FractionField(RptW)
Rxy.<x, y> = PolynomialRing(F)
RxyQ = FractionField(Rxy)
delta, a, b = xgcd(m, r)
a = -a
M = m/delta
R = r/delta
while a<0:
a += R
b += M
g = (x^r*f(x = 1/x))
gW = RptWQ(g(x = t^M * W^b)) - W^(delta)
self.x_series = []
self.y_series = []
self.dx_series = []
for place in range(delta):
ww = naive_hensel(gW, F, start = root_of_unity(F, delta)^place, prec = prec)
xx = Rt(1/(t^M*ww^b))
yy = 1/(t^R*ww^a)
self.x_series += [xx]
self.y_series += [yy]
self.dx_series += [xx.derivative()]
def __repr__(self): def __repr__(self):
f = self.polynomial f = self.polynomial

View File

@ -137,10 +137,10 @@ class superelliptic_form:
g = self.form g = self.form
C = self.curve C = self.curve
g = superelliptic_function(C, g) g = superelliptic_function(C, g)
g = g.expansion_at_infty(place = place, prec=prec) F = C.base_ring
x_series = C.x.expansion_at_infty(place = place, prec=prec) Rt.<t> = LaurentSeriesRing(F, default_prec=prec)
dx_series = x_series.derivative() g = Rt(g.expansion_at_infty(place = place, prec=prec))
return g*dx_series return g*C.dx_series[place]
def expansion(self, pt, prec = 50): def expansion(self, pt, prec = 50):
'''Expansion in the completed ring of the point pt. If pt is an integer, it means the corresponding place at infinity.''' '''Expansion in the completed ring of the point pt. If pt is an integer, it means the corresponding place at infinity.'''

View File

@ -108,31 +108,11 @@ class superelliptic_function:
def expansion_at_infty(self, place = 0, prec=20): def expansion_at_infty(self, place = 0, prec=20):
C = self.curve C = self.curve
f = C.polynomial
m = C.exponent
F = C.base_ring
Rx.<x> = PolynomialRing(F)
f = Rx(f)
Rt.<t> = LaurentSeriesRing(F, default_prec=prec)
RptW.<W> = PolynomialRing(Rt)
RptWQ = FractionField(RptW)
Rxy.<x, y> = PolynomialRing(F)
RxyQ = FractionField(Rxy)
fct = self.function fct = self.function
fct = RxyQ(fct) F = C.base_ring
r = f.degree() Rt.<t> = LaurentSeriesRing(F, default_prec=prec)
delta, a, b = xgcd(m, r) xx = C.x_series[place]
a = -a yy = C.y_series[place]
M = m/delta
R = r/delta
while a<0:
a += R
b += M
g = (x^r*f(x = 1/x))
gW = RptWQ(g(x = t^M * W^b)) - W^(delta)
ww = naive_hensel(gW, F, start = root_of_unity(F, delta)^place, prec = prec)
xx = Rt(1/(t^M*ww^b))
yy = 1/(t^R*ww^a)
return Rt(fct(x = Rt(xx), y = Rt(yy))) return Rt(fct(x = Rt(xx), y = Rt(yy)))
def expansion(self, pt, prec = 50): def expansion(self, pt, prec = 50):

View File

@ -34,10 +34,10 @@ def de_rham_witt_lift(cech_class, prec = 50):
def crystalline_cohomology_basis(self, prec = 50, info = 0): def crystalline_cohomology_basis(self, prec = 50, info = 0):
result = [] result = []
prec1 = prec
for i, a in enumerate(self.de_rham_basis()): for i, a in enumerate(self.de_rham_basis()):
if info: if info:
print("Computing " + str(i) +". basis element") print("Computing " + str(i) +". basis element")
prec1 = prec
while True: while True:
try: try:
result += [de_rham_witt_lift(a, prec = prec1)] result += [de_rham_witt_lift(a, prec = prec1)]

View File

@ -74,12 +74,14 @@ class superelliptic_regular_drw_form:
def regular_drw_form(omega): def regular_drw_form(omega):
C = omega.curve C = omega.curve
p = C.characteristic
omega_aux = omega.r() omega_aux = omega.r()
omega_aux = omega_aux.regular_form() omega_aux = omega_aux.regular_form()
aux = omega - omega_aux.dx.teichmuller()*C.x.teichmuller().diffn() - omega_aux.dy.teichmuller()*C.y.teichmuller().diffn() aux = omega - omega_aux.dx.teichmuller()*C.x.teichmuller().diffn() - omega_aux.dy.teichmuller()*C.y.teichmuller().diffn()
aux.omega, fct = decomposition_omega0_hpdh(aux.omega) aux.omega, fct = decomposition_omega0_hpdh(aux.omega)
aux.h2 += fct^p aux.h2 += fct^p
aux.h2 = decomposition_g0_p2th_power(aux.h2)[0] aux.h2, A = decomposition_g0_pth_power(aux.h2)
aux.omega += (A.diffn()).inv_cartier()
result = superelliptic_regular_drw_form(omega_aux.dx, omega_aux.dy, aux.omega.regular_form(), aux.h2) result = superelliptic_regular_drw_form(omega_aux.dx, omega_aux.dy, aux.omega.regular_form(), aux.h2)
return result return result

View File

@ -1,4 +1,8 @@
def decomposition_g0_pth_power(fct): def decomposition_g0_pth_power(fct):
C = fct.curve
Fxy, Rxy, xy, y = C.fct_field
if fct.function in Rxy:
return (fct, 0*C.x)
'''Decompose fct as g0 + A^p, if possible. Output: (g0, A).''' '''Decompose fct as g0 + A^p, if possible. Output: (g0, A).'''
omega = fct.diffn().regular_form() omega = fct.diffn().regular_form()
g0 = omega.int() g0 = omega.int()
@ -7,6 +11,8 @@ def decomposition_g0_pth_power(fct):
def decomposition_g0_p2th_power(fct): def decomposition_g0_p2th_power(fct):
'''Decompose fct as g0 + A^(p^2), if possible. Output: (g0, A).''' '''Decompose fct as g0 + A^(p^2), if possible. Output: (g0, A).'''
C = fct.curve
p = C.characteristic
g0, A = decomposition_g0_pth_power(fct) g0, A = decomposition_g0_pth_power(fct)
A0, A1 = decomposition_g0_pth_power(A) A0, A1 = decomposition_g0_pth_power(A)
return (g0 + A0^p, A1) return (g0 + A0^p, A1)
@ -14,6 +20,9 @@ def decomposition_g0_p2th_power(fct):
def decomposition_omega0_hpdh(omega): def decomposition_omega0_hpdh(omega):
'''Decompose omega = (regular on U0) + h^(p-1) dh, so that Cartier(omega) = (regular on U0) + dh. '''Decompose omega = (regular on U0) + h^(p-1) dh, so that Cartier(omega) = (regular on U0) + dh.
Result: (regular on U0, h)''' Result: (regular on U0, h)'''
C = omega.curve
if omega.is_regular_on_U0():
return (omega, 0*C.x)
omega1 = omega.cartier().cartier() omega1 = omega.cartier().cartier()
omega1 = omega1.inv_cartier().inv_cartier() omega1 = omega1.inv_cartier().inv_cartier()
fct = (omega.cartier() - omega1.cartier()).int() fct = (omega.cartier() - omega1.cartier()).int()
@ -27,6 +36,9 @@ def decomposition_omega8_hpdh(omega, prec = 50):
Fxy, Rxy, x, y = C.fct_field Fxy, Rxy, x, y = C.fct_field
F = C.base_ring F = C.base_ring
p = C.characteristic p = C.characteristic
C = omega.curve
if omega.is_regular_on_Uinfty():
return (omega, 0*C.x)
Rt.<t> = LaurentSeriesRing(F) Rt.<t> = LaurentSeriesRing(F)
omega_analytic = Rt(laurent_analytic_part(omega.expansion_at_infty(prec = prec))) omega_analytic = Rt(laurent_analytic_part(omega.expansion_at_infty(prec = prec)))
Cv = C.uniformizer() Cv = C.uniformizer()
@ -44,6 +56,8 @@ def decomposition_g8_pth_power(fct, prec = 50):
F = C.base_ring F = C.base_ring
Rt.<t> = LaurentSeriesRing(F) Rt.<t> = LaurentSeriesRing(F)
Fxy, Rxy, x, y = C.fct_field Fxy, Rxy, x, y = C.fct_field
if fct.expansion_at_infty().valuation() >= 0:
return (fct, 0*C.x)
A = laurent_analytic_part(fct.expansion_at_infty(prec = prec)) A = laurent_analytic_part(fct.expansion_at_infty(prec = prec))
Cv = C.uniformizer() Cv = C.uniformizer()
v = Cv.function v = Cv.function

View File

@ -56,13 +56,19 @@ class superelliptic_drw_cech:
C = self.curve C = self.curve
return superelliptic_cech(C, omega0.h1*C.dx, f.t) return superelliptic_cech(C, omega0.h1*C.dx, f.t)
def div_by_p(self): def div_by_p(self, info = 0):
'''Given a regular cocycle of the form (V(omega) + dV(h), [f] + V(t), ...), where [f] = 0 in H^1(X, OX), '''Given a regular cocycle of the form (V(omega) + dV(h), [f] + V(t), ...), where [f] = 0 in H^1(X, OX),
find de Rham cocycle (xi0, f, xi8) such that (V(omega) + dV(h), [f] + V(t), ...) = p*(xi0, f, xi8).''' find de Rham cocycle (xi0, f, xi8) such that (V(omega) + dV(h), [f] + V(t), ...) = p*(xi0, f, xi8).'''
#
if info: print("Computing " + str(self) + " divided by p.")
#
C = self.curve C = self.curve
aux = self aux = self
Fxy, Rxy, x, y = C.fct_field Fxy, Rxy, x, y = C.fct_field
aux_f_t_0 = decomposition_g0_g8(aux.f.t, prec=50)[0] aux_f_t_0 = decomposition_g0_g8(aux.f.t, prec=50)[0]
#
if info: print("Computed decomposition_g0_g8 of self.f.t.")
#
aux.f.t = 0*C.x aux.f.t = 0*C.x
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()
@ -72,9 +78,17 @@ class superelliptic_drw_cech:
omega = aux.omega0.omega omega = aux.omega0.omega
aux.omega0.omega, fct = decomposition_omega0_hpdh(aux.omega0.omega) aux.omega0.omega, fct = decomposition_omega0_hpdh(aux.omega0.omega)
aux.omega0.h2 += fct^p aux.omega0.h2 += fct^p
#
if info: print("Computed decomposition_omega0_hpdh of self.omega0.omega.")
#
# Now we have to ensure that aux.omega0.h2.function in Rxy... # Now we have to ensure that aux.omega0.h2.function in Rxy...
# In other words, we decompose h2 = (regular on U0) + A^(p^2). # In other words, we decompose h2 = (regular on U0) + A^p.
aux.omega0.h2 = decomposition_g0_p2th_power(aux.omega0.h2)[0] # Then we replace h2 by (regular on U0) and omega by omega + inverse Cartier(dA)
aux.omega0.h2, A = decomposition_g0_pth_power(aux.omega0.h2)
aux.omega0.omega += (A.diffn()).inv_cartier()
#
if info: print("Computed decomposition_g0_p2th_power(aux.omega0.h2).")
#
# Now we can reduce: (... + dV(h2), V(f), ...) --> (..., V(f - h2), ...) # 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
@ -87,18 +101,21 @@ class superelliptic_drw_cech:
aux_divided_by_p = superelliptic_cech(C, aux.omega0.omega.cartier(), aux.f.f.pth_root()) aux_divided_by_p = superelliptic_cech(C, aux.omega0.omega.cartier(), aux.f.f.pth_root())
return aux_divided_by_p return aux_divided_by_p
def coordinates(self, basis = 0, prec = 50): def coordinates(self, basis = 0, prec = 50, info = 0):
if info: print("Computing coordinates of " + str(self))
C = self.curve C = self.curve
g = C.genus() g = C.genus()
coord_mod_p = self.r().coordinates() coord_mod_p = self.r().coordinates()
if info: print("Computed coordinates mod p.")
coord_lifted = [lift(a) for a in coord_mod_p] coord_lifted = [lift(a) for a in coord_mod_p]
if basis == 0: if basis == 0:
basis = C.crystalline_cohomology_basis() basis = C.crystalline_cohomology_basis()
aux = self aux = self
for i, a in enumerate(basis): for i, a in enumerate(basis):
aux -= coord_lifted[i]*a aux -= coord_lifted[i]*a
aux_divided_by_p = aux.div_by_p() aux_divided_by_p = aux.div_by_p(info = info)
coord_aux_divided_by_p = aux_divided_by_p.coordinates() coord_aux_divided_by_p = aux_divided_by_p.coordinates()
if info: print("Computed coordinates mod p of (self - lift)/p.")
coord_aux_divided_by_p = [ZZ(a) for a in coord_aux_divided_by_p] coord_aux_divided_by_p = [ZZ(a) for a in coord_aux_divided_by_p]
coordinates = [ (coord_lifted[i] + p*coord_aux_divided_by_p[i])%p^2 for i in range(2*g)] coordinates = [ (coord_lifted[i] + p*coord_aux_divided_by_p[i])%p^2 for i in range(2*g)]
return coordinates return coordinates

View File

@ -1,6 +1,6 @@
load('init.sage') #load('init.sage')
#print("Expansion at infty test:") print("Expansion at infty test:")
#load('superelliptic/tests/expansion_at_infty.sage') load('superelliptic/tests/expansion_at_infty.sage')
#print("superelliptic form coordinates test:") #print("superelliptic form coordinates test:")
#load('superelliptic/tests/form_coordinates_test.sage') #load('superelliptic/tests/form_coordinates_test.sage')
#print("p-th root test:") #print("p-th root test:")