naprawiony problem z uniformizatorem w superelliptic; decomposition_omega8_hpdh dziala
This commit is contained in:
parent
42ccc4d3e9
commit
995d5f02d8
File diff suppressed because one or more lines are too long
@ -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')
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -57,11 +57,4 @@ def decomposition_omega0_omega8(omega, prec=50):
|
|||||||
#Rx.<x> = PolynomialRing(F)
|
#Rx.<x> = PolynomialRing(F)
|
||||||
#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
|
|
49
sage/superelliptic_drw/superelliptic_drw_auxilliaries.sage
Normal file
49
sage/superelliptic_drw/superelliptic_drw_auxilliaries.sage
Normal 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)
|
@ -67,30 +67,34 @@ 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.f -= aux.omega0.h2.verschiebung()
|
aux.omega0.h2 = decomposition_g0_p2th_power(aux.omega0.h2)[0]
|
||||||
aux.omega0.h2 = 0*C.x
|
# Now we can reduce: (... + dV(h2), V(f), ...) --> (..., V(f - h2), ...)
|
||||||
if aux.omega8.h2.expansion_at_infty().valuation() >= 0:
|
aux.f -= aux.omega0.h2.verschiebung()
|
||||||
aux.f += aux.omega8.h2.verschiebung()
|
aux.omega0.h2 = 0*C.x
|
||||||
aux.omega8.h2 = 0*C.x
|
|
||||||
print('aux', aux)
|
if aux.omega8.h2.expansion_at_infty().valuation() >= 0:
|
||||||
# Now aux should be of the form (V(omega1), V(f), V(omega2))
|
aux.f += aux.omega8.h2.verschiebung()
|
||||||
# Thus aux = p*(Cartier(omega1), p-th_root(f), Cartier(omega2))
|
aux.omega8.h2 = 0*C.x
|
||||||
aux_divided_by_p = superelliptic_cech(C, aux.omega0.omega.cartier(), aux.f.f.pth_root())
|
print('aux', aux)
|
||||||
print('aux_divided_by_p', aux_divided_by_p)
|
# Now aux should be of the form (V(omega1), V(f), V(omega2))
|
||||||
print('is regular', aux_divided_by_p.omega0.is_regular_on_U0(), aux_divided_by_p.omega8.is_regular_on_Uinfty())
|
# Thus aux = p*(Cartier(omega1), p-th_root(f), Cartier(omega2))
|
||||||
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())
|
aux_divided_by_p = superelliptic_cech(C, aux.omega0.omega.cartier(), aux.f.f.pth_root())
|
||||||
return aux_divided_by_p
|
print('aux_divided_by_p', aux_divided_by_p)
|
||||||
else:
|
print('is regular', aux_divided_by_p.omega0.is_regular_on_U0(), aux_divided_by_p.omega8.is_regular_on_Uinfty())
|
||||||
raise ValueError("aux.omega8.h2.expansion_at_infty().valuation() < 0:", aux.omega8.h2.expansion_at_infty())
|
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
|
||||||
else:
|
else:
|
||||||
raise ValueError("aux.omega0.h2.function not in Rxy:", aux.omega0.h2.function)
|
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())
|
||||||
|
|
||||||
def coordinates(self, basis = 0):
|
def coordinates(self, basis = 0):
|
||||||
C = self.curve
|
C = self.curve
|
||||||
@ -113,4 +117,4 @@ class superelliptic_drw_cech:
|
|||||||
print(self.omega0.r().is_regular_on_U0(), self.omega8.r().is_regular_on_Uinfty(), self.omega0.frobenius().is_regular_on_U0(), self.omega8.frobenius().is_regular_on_Uinfty())
|
print(self.omega0.r().is_regular_on_U0(), self.omega8.r().is_regular_on_Uinfty(), self.omega0.frobenius().is_regular_on_U0(), self.omega8.frobenius().is_regular_on_Uinfty())
|
||||||
eq1 = self.omega0.r().is_regular_on_U0() and self.omega8.r().is_regular_on_Uinfty()
|
eq1 = self.omega0.r().is_regular_on_U0() and self.omega8.r().is_regular_on_Uinfty()
|
||||||
eq2 = self.omega0.frobenius().is_regular_on_U0() and self.omega8.frobenius().is_regular_on_Uinfty()
|
eq2 = self.omega0.frobenius().is_regular_on_U0() and self.omega8.frobenius().is_regular_on_Uinfty()
|
||||||
return eq1 and eq2
|
return eq1 and eq2
|
Loading…
Reference in New Issue
Block a user