dzialaja wspolrzedne crystalline cohomologygit add sage/superelliptic_drw/tests/auxilliary_decompositions_test.sage sage/superelliptic_drw/regular_form.sage sage/superelliptic/tests/expansion_at_infty.sage sage/auxilliaries/laurent_analytic_part.sagegit add sage/superelliptic_drw/tests/auxilliary_decompositions_test.sage sage/superelliptic_drw/regular_form.sage sage/superelliptic/tests/expansion_at_infty.sage sage/auxilliaries/laurent_analytic_part.sage

This commit is contained in:
jgarnek 2023-03-24 19:42:29 +00:00
parent 995d5f02d8
commit a9d055aa55
9 changed files with 1398 additions and 27 deletions

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,16 @@
def laurent_analytic_part(series):
F = base_ring(parent(series))
Ft.<t> = LaurentSeriesRing(F)
result = Ft(0)
for i in series.exponents():
if i<0:
result += series[i]*t^i
return result
def laurent_integral(series):
F = base_ring(parent(series))
Ft.<t> = LaurentSeriesRing(F)
result = Ft(0)
for i in series.exponents():
result += series[i]*(t^i).integral()
return result

View File

@ -216,7 +216,7 @@ class superelliptic:
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).'''
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)

View File

@ -0,0 +1,14 @@
p = 3
F = GF(3)
Rx.<x> = PolynomialRing(F)
f = x^3 - x
m = 2
C = superelliptic(f, m)
xx = C.x.expansion_at_infty(prec = 200)
yy = C.y.expansion_at_infty(prec = 200)
r = f.degree()
delta = GCD(m, r)
R = r/delta
M = m/delta
print(yy^2 == f(x = xx))
print(xx.valuation() == -M, yy.valuation() == -R)

View File

@ -0,0 +1,102 @@
class superelliptic_regular_form:
def __init__(self, A, B):
self.dx = A
self.dy = B
self.curve = A.curve
def __repr__(self):
if self.dx.function == 0:
return "(" + str(self.dy) + ") dy"
if self.dy.function == 0:
return "("+str(self.dx) + ") dx"
return "("+str(self.dx) + ") dx + (" + str(self.dy) + ") dy"
def form(self):
C = self.curve
return self.dx*C.dx + self.dy*C.y.diffn()
def int(self):
'''Regular integral. Works only for hyperelliptics.'''
C = self.curve
f = C.polynomial
if C.exponent != 2:
raise ValueError("Works only for hyperelliptics.")
F = C.base_ring
Rx.<x> = PolynomialRing(F)
Fxy, Rxy, x, y = C.fct_field
if self.dx == 0*C.x and self.dy == 0*C.x:
return 0*C.x
#which = random.choice([0, 1])
P = self.dx.function
Q = self.dy.function
Py, Px = P.quo_rem(y) #P = y*Py + Px
Qy, Qx = Q.quo_rem(y)
result = superelliptic_function(C, Rx(Px + 1/2*Qy*f.derivative()).integral())
numerator = Rx(2*f*Py + f.derivative()*Qx)
# Now numerator = 2W' f + W f'. We are looking for W. Then result is W*y.
W = Rx(0)
while(numerator != 0):
d = numerator.degree()
r = f.degree()
n_lead = numerator.leading_coefficient()
f_lead = Rx(f).leading_coefficient()
a = d - (r-1)
if a >= 0:
W_coeff = F(n_lead/f_lead)*F((2*a + r)^(-1))
W += W_coeff*Rx(x^a)
numerator -= 2*f*(W_coeff*Rx(x^a)).derivative() + (W_coeff*Rx(x^a))*f.derivative()
numerator = Rx(numerator)
if a < 0:
W += Rx(numerator/f.derivative())
numerator = Rx(0)
result = result + superelliptic_function(C, y*W)
return result
class superelliptic_regular_drw_form:
def __init__(self, A, B, omega, h2):
self.dx = A
self.dy = B
self.omega = omega
self.h2 = h2
self.curve = A.curve
def form(self):
C = self.curve
A = self.dx
B = self.dy
h2 = self.h2
omega = self.omega
form1 = superelliptic_drw_form(A, omega, h2)
form2 = B.teichmuller()*C.y.teichmuller().diffn()
def __repr__(self):
return "[" + str(self.dx) + "] d[x] + [" + str(self.dy) + "] d[y] + V(" + str(self.omega) + ") + dV(" + str(self.h2) + ")"
def regular_drw_form(omega):
C = omega.curve
omega_aux = omega.r()
omega_aux = omega_aux.regular_form()
aux = omega - omega_aux.dx.teichmuller()*C.x.teichmuller().diffn() - omega_aux.dy.teichmuller()*C.y.teichmuller().diffn()
result = superelliptic_regular_drw_form(omega_aux.dx, omega_aux.dy, aux.omega, aux.h2)
return result
superelliptic_drw_form.regular_form = regular_drw_form
def regular_form(omega):
'''Given a form omega regular on U0, present it as P(x, y) dx + Q(x, y) dy for some polynomial P, Q.
The output is A(x)*y, B(x), where omega = A(x) y dx + B(x) dy'''
C = omega.curve
f = C.polynomial
Fxy, Rxy, x, y = C.fct_field
F = C.base_ring
Rx.<x> = PolynomialRing(F)
fct = omega.form
if fct.denominator() == y:
fct = fct.numerator()
integral_part, fct = fct.quo_rem(y)
d, A, B = xgcd(f, f.derivative())
return superelliptic_regular_form(superelliptic_function(C, integral_part + A*fct*y), superelliptic_function(C,2*B*fct))
if fct.denominator() == 1:
return superelliptic_regular_form(superelliptic_function(C, fct), 0*C.x)
superelliptic_form.regular_form = regular_form

View File

@ -20,6 +20,7 @@ def decomposition_omega0_hpdh(omega):
return (omega1, fct)
def decomposition_omega8_hpdh(omega, prec = 50):
print('decomposition_omega8_hpdh', omega)
'''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
@ -28,15 +29,11 @@ def decomposition_omega8_hpdh(omega, prec = 50):
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))
omega_analytic = Rt(laurent_analytic_part(omega.expansion_at_infty(prec = prec)))
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 = Fxy(omega_analytic(t = v))
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)
@ -46,4 +43,27 @@ def decomposition_omega8_hpdh(omega, prec = 50):
print('dh', dh)
h = dh.int()
print('omega8.expansion_at_infty()', omega8.expansion_at_infty(prec = prec))
return (omega8, h)
return (omega8, h)
def decomposition_g8_pth_power(fct, prec = 50):
print('decomposition_g8_pth_power', fct)
'''Decompose fct as g8 + A^p, if possible. Output: (g8, A).'''
C = fct.curve
F = C.base_ring
Rt.<t> = LaurentSeriesRing(F)
Fxy, Rxy, x, y = C.fct_field
A = laurent_analytic_part(fct.expansion_at_infty(prec = prec))
Cv = C.uniformizer()
v = Cv.function
A = A(t = v)
A = superelliptic_function(C, A)
A = A.pth_root()
g8 = fct - A^p
return (g8, A)
def decomposition_g8_p2th_power(fct):
print('decomposition_g8_p2th_power', fct)
'''Decompose fct as g8 + A^(p^2), if possible. Output: (g8, A).'''
g0, A = decomposition_g8_pth_power(fct)
A0, A1 = decomposition_g8_pth_power(A)
return (g0 + A0^p, A1)

View File

@ -78,23 +78,15 @@ class superelliptic_drw_cech:
# 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:
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())
# Now the same for aux.omega8
aux.omega8.omega, fct = decomposition_omega8_hpdh(aux.omega8.omega)
aux.omega8.h2 += fct^p
aux.omega8.h2 = decomposition_g8_p2th_power(aux.omega8.h2)[0]
aux.f += aux.omega8.h2.verschiebung()
aux.omega8.h2 = 0*C.x
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
def coordinates(self, basis = 0):
C = self.curve

View File

@ -0,0 +1,14 @@
p = 3
F = GF(3)
Rx.<x> = PolynomialRing(F)
C = superelliptic((x^3 - x)^3 + x^3 - x, 2)
Fxy, Rxy, x, y = C.fct_field
om = ((C.x^28 - C.x^26 + C.x^25 - C.x^24 + C.x^23 - C.x^22 - C.x^21 + C.x^20 + C.x^19 + C.x^18 + C.x^17 + C.x^15 - C.x^14 + C.x^13 + C.x^12 + C.x^11 - C.x^10 - C.x^8 - C.x^7 + C.x^6 - C.x^5 + C.x^4 + C.x^2 + C.x - C.one)/(C.x^16*C.y - C.x^15*C.y + C.x^14*C.y - C.x^13*C.y + C.x^12*C.y - C.x^11*C.y + C.x^10*C.y - C.x^9*C.y - C.x^8*C.y + C.x^7*C.y - C.x^6*C.y + C.x^5*C.y - C.x^4*C.y + C.x^3*C.y - C.x^2*C.y + C.x*C.y))*C.dx
om1, A = decomposition_omega8_hpdh(om)
print(om1.is_regular_on_Uinfty() and om.cartier() == om1.cartier() + A.diffn())
ff = ((2*C.x^74 + C.x^73 + C.x^71 + 2*C.x^70 + 2*C.x^65 + C.x^64 + C.x^62 + 2*C.x^61 + 2*C.x^56 + C.x^55 + C.x^53 + 2*C.x^52 + C.x^50 + 2*C.x^49 + 2*C.x^47 + C.x^46 + C.x^44 + 2*C.x^43 + 2*C.x^38 + C.x^37 + C.x^32 + 2*C.x^31 + 2*C.x^29 + C.x^28 + C.x^26 + 2*C.x^25 + C.x^23 + 2*C.x^22 + 2*C.x^17 + C.x^16 + C.x^14 + 2*C.x^13 + 2*C.x^8 + C.x^7 + C.x^5 + 2*C.x^4 + 2*C.x^2 + C.x)/(C.x^35 + 2*C.x^34 + 2*C.x^32 + C.x^31 + C.x^27 + 2*C.x^25 + 2*C.x^24 + C.x^22 + C.x^19 + C.x^16 + C.x^13 + 2*C.x^11 + 2*C.x^10 + C.x^8 + C.x^4 + 2*C.x^3 + 2*C.x + C.one))*C.y
ff1, ff2 = decomposition_g0_p2th_power(ff)
print(ff == ff1 + ff2^(p^2), ff1.function in Rxy)
om = ((C.x^18 - C.x^10 - C.x^9 + C.x)/C.y) * C.dx
om1, h = decomposition_omega0_hpdh(om)
print(om.cartier() == om1.cartier() + h.diffn(), om1.is_regular_on_U0())

View File

@ -1,12 +1,14 @@
load('init.sage')
#print("Expansion at infty test:")
#load('superelliptic/tests/expansion_at_infty.sage')
#print("superelliptic form coordinates test:")
#load('superelliptic/tests/form_coordinates_test.sage')
#print("p-th root test:")
#load('superelliptic/tests/pth_root_test.sage')
#print("not working! superelliptic p rank test:")
#load('superelliptic/tests/p_rank_test.sage')
print("a-number test:")
load('superelliptic/tests/a_number_test.sage')
#print("a-number test:")
#load('superelliptic/tests/a_number_test.sage')
#print("as_cover_test:")
#load('as_covers/tests/as_cover_test.sage')
#print("group_action_matrices_test:")