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_drw_form.sage')
|
||||
load('superelliptic_drw/superelliptic_drw_cech.sage')
|
||||
load('superelliptic_drw/superelliptic_drw_auxilliaries.sage')
|
||||
load('superelliptic_drw/regular_form.sage')
|
||||
load('superelliptic_drw/de_rham_witt_lift.sage')
|
||||
load('superelliptic_drw/automorphism.sage')
|
||||
load('auxilliaries/reverse.sage')
|
||||
load('auxilliaries/hensel.sage')
|
||||
load('auxilliaries/linear_combination_polynomials.sage')
|
||||
load('auxilliaries/laurent_analytic_part.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))]
|
||||
return basis
|
||||
|
||||
#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).
|
||||
def uniformizer(self):
|
||||
m = self.exponent
|
||||
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):
|
||||
'''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
|
||||
F = C.base_ring
|
||||
Rxy.<x, y> = PolynomialRing(F, 2)
|
||||
|
@ -122,13 +122,12 @@ class superelliptic_function:
|
||||
fct = RxyQ(fct)
|
||||
r = f.degree()
|
||||
delta, a, b = xgcd(m, r)
|
||||
b = -b
|
||||
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)
|
||||
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)
|
||||
#aux_fct = (g0.form)*y
|
||||
else:
|
||||
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
|
||||
raise ValueError("Something went wrong for "+str(omega) +". Result would be "+str(g0)+ " and " + str(g8))
|
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.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
|
||||
omega1 = omega.cartier().cartier()
|
||||
omega1 = omega1.inv_cartier().inv_cartier()
|
||||
fct = (omega.cartier() - omega1.cartier()).int()
|
||||
aux.omega0.omega, fct = decomposition_omega0_hpdh(aux.omega0.omega)
|
||||
aux.omega0.h2 += fct^p
|
||||
aux.omega0.omega = omega1
|
||||
if aux.omega0.h2.function in Rxy:
|
||||
aux.f -= aux.omega0.h2.verschiebung()
|
||||
aux.omega0.h2 = 0*C.x
|
||||
if aux.omega8.h2.expansion_at_infty().valuation() >= 0:
|
||||
aux.f += aux.omega8.h2.verschiebung()
|
||||
aux.omega8.h2 = 0*C.x
|
||||
print('aux', aux)
|
||||
# Now aux should be of the form (V(omega1), V(f), V(omega2))
|
||||
# Thus aux = p*(Cartier(omega1), p-th_root(f), Cartier(omega2))
|
||||
aux_divided_by_p = superelliptic_cech(C, aux.omega0.omega.cartier(), aux.f.f.pth_root())
|
||||
print('aux_divided_by_p', aux_divided_by_p)
|
||||
print('is regular', aux_divided_by_p.omega0.is_regular_on_U0(), aux_divided_by_p.omega8.is_regular_on_Uinfty())
|
||||
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:
|
||||
raise ValueError("aux.omega8.h2.expansion_at_infty().valuation() < 0:", aux.omega8.h2.expansion_at_infty())
|
||||
# Now we have to ensure that 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.omega0.h2 = 0*C.x
|
||||
|
||||
if aux.omega8.h2.expansion_at_infty().valuation() >= 0:
|
||||
aux.f += aux.omega8.h2.verschiebung()
|
||||
aux.omega8.h2 = 0*C.x
|
||||
print('aux', aux)
|
||||
# Now aux should be of the form (V(omega1), V(f), V(omega2))
|
||||
# Thus aux = p*(Cartier(omega1), p-th_root(f), Cartier(omega2))
|
||||
aux_divided_by_p = superelliptic_cech(C, aux.omega0.omega.cartier(), aux.f.f.pth_root())
|
||||
print('aux_divided_by_p', aux_divided_by_p)
|
||||
print('is regular', aux_divided_by_p.omega0.is_regular_on_U0(), aux_divided_by_p.omega8.is_regular_on_Uinfty())
|
||||
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:
|
||||
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):
|
||||
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())
|
||||
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()
|
||||
return eq1 and eq2
|
||||
return eq1 and eq2
|
Loading…
Reference in New Issue
Block a user