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:
parent
995d5f02d8
commit
a9d055aa55
File diff suppressed because one or more lines are too long
16
sage/auxilliaries/laurent_analytic_part.sage
Normal file
16
sage/auxilliaries/laurent_analytic_part.sage
Normal 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
|
@ -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)
|
||||
|
14
sage/superelliptic/tests/expansion_at_infty.sage
Normal file
14
sage/superelliptic/tests/expansion_at_infty.sage
Normal 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)
|
102
sage/superelliptic_drw/regular_form.sage
Normal file
102
sage/superelliptic_drw/regular_form.sage
Normal 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
|
@ -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)
|
@ -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
|
||||
|
@ -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())
|
@ -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:")
|
||||
|
Loading…
Reference in New Issue
Block a user