poprawiony rozklad na omega0 - omega8

This commit is contained in:
jgarnek 2023-02-27 11:51:16 +00:00
parent 8719e64d9f
commit 7e8546b2c3
6 changed files with 2553 additions and 29 deletions

File diff suppressed because one or more lines are too long

View File

@ -2,8 +2,7 @@ p = 3
m = 2 m = 2
F = GF(p) F = GF(p)
Rx.<x> = PolynomialRing(F) Rx.<x> = PolynomialRing(F)
f = x^3 - x f = x^3 - x + 1
C = superelliptic(f, m) C = superelliptic(f, m)
a = superelliptic_drw_form(C.one, 0*C.dx, 0*C.x) C1 = patch(C)
b = a+a+a+a+a+a+a+a+a print(C1.crystalline_cohomology_basis())
print(b)

View File

@ -310,7 +310,26 @@ class superelliptic_drw_cech:
f = self.f f = self.f
return superelliptic_drw_cech(other*omega0, other*f) return superelliptic_drw_cech(other*omega0, other*f)
def de_rham_witt_lift(cech_class): def r(self):
omega0 = self.omega0
f = self.f
C = self.curve
return superelliptic_cech(C, omega0.h1*C.dx, f.t)
def coordinates(self, basis = 0):
coord_mod_p = self.r().coordinates()
print(coord_mod_p)
coord_lifted = [lift(a) for a in coord_mod_p]
if basis == 0:
basis = self.curve().crystalline_cohomology_basis()
aux = self
for i, a in enumerate(basis):
aux -= coord_lifted[i]*a
aux = aux.reduce()
return aux
def de_rham_witt_lift(cech_class, prec = 50):
C = cech_class.curve C = cech_class.curve
g = C.genus() g = C.genus()
omega0 = cech_class.omega0 omega0 = cech_class.omega0
@ -324,7 +343,37 @@ def de_rham_witt_lift(cech_class):
v = (C.y)/(C.x)^(g+1) v = (C.y)/(C.x)^(g+1)
omega8_lift = omega0_regular[0].teichmuller()*(u.teichmuller().diffn()) + omega0_regular[1].teichmuller()*(v.teichmuller().diffn()) omega8_lift = omega0_regular[0].teichmuller()*(u.teichmuller().diffn()) + omega0_regular[1].teichmuller()*(v.teichmuller().diffn())
aux = omega0_lift - omega8_lift - fct.teichmuller().diffn() aux = omega0_lift - omega8_lift - fct.teichmuller().diffn()
aux_h2 = decomposition_g0_g8(aux.h2)[0] decom_aux_h2 = decomposition_g0_g8(aux.h2, prec=prec)
aux_f = decomposition_g0_g8(aux.h2)[2] #do napisania - komponent od kohomologii aux_h2 = decom_aux_h2[0]
aux_omega0 = decomposition_omega0_omega8(aux.omega)[0] aux_f = decom_aux_h2[2]
aux_omega0 = decomposition_omega0_omega8(aux.omega, prec=prec)[0]
return superelliptic_drw_cech(omega0_lift + aux_h2.verschiebung().diffn() + aux_omega0.verschiebung(), fct.teichmuller() + aux_f.verschiebung()) return superelliptic_drw_cech(omega0_lift + aux_h2.verschiebung().diffn() + aux_omega0.verschiebung(), fct.teichmuller() + aux_f.verschiebung())
def crystalline_cohomology_basis(self, prec = 50):
result = []
for a in self.de_rham_basis():
result += [de_rham_witt_lift(a, prec = prec)]
return result
superelliptic.crystalline_cohomology_basis = crystalline_cohomology_basis
def autom(self):
C = self.curve
F = C.base_ring
Rxy.<x, y> = PolynomialRing(F, 2)
Fxy = FractionField(Rxy)
if isinstance(self, superelliptic_function):
result = superelliptic_function(C, Fxy(self.function).subs({x:x+1, y:y}))
return result
if isinstance(self, superelliptic_form):
result = superelliptic_form(C, Fxy(self.form).subs({x:x+1, y:y}))
return result
if isinstance(self, superelliptic_witt):
result = superelliptic_witt(autom(self.t), autom(self.f))
return result
if isinstance(self, superelliptic_drw_form):
result = superelliptic_drw_form(autom(self.h1), autom(self.omega), autom(self.h2))
return result
if isinstance(self, superelliptic_drw_cech):
result = superelliptic_drw_cech(autom(self.omega0), autom(self.f))
return result

View File

@ -1,4 +1,4 @@
def decomposition_g0_g8(fct): def decomposition_g0_g8(fct, prec = 50):
'''Writes fct as a difference g0 - g8, with g0 regular on the affine patch and g8 at the points in infinity.''' '''Writes fct as a difference g0 - g8, with g0 regular on the affine patch and g8 at the points in infinity.'''
C = fct.curve C = fct.curve
g = C.genus() g = C.genus()
@ -7,7 +7,7 @@ def decomposition_g0_g8(fct):
for i, a in enumerate(C.cohomology_of_structure_sheaf_basis()): for i, a in enumerate(C.cohomology_of_structure_sheaf_basis()):
nontrivial_part += coord[i]*a nontrivial_part += coord[i]*a
fct -= nontrivial_part fct -= nontrivial_part
if fct.coordinates() != g*[0]: if fct.coordinates(prec=prec) != g*[0]:
raise ValueError("The given function cannot be written as g0 - g8.") raise ValueError("The given function cannot be written as g0 - g8.")
Fxy, Rxy, x, y = C.fct_field Fxy, Rxy, x, y = C.fct_field
@ -28,22 +28,33 @@ def decomposition_g0_g8(fct):
def decomposition_omega0_omega8(omega, prec=50): def decomposition_omega0_omega8(omega, prec=50):
'''Writes omega as a difference omega0 - omega8, with omega0 regular on the affine patch and omega8 at the points in infinity.''' '''Writes omega as a difference omega0 - omega8, with omega0 regular on the affine patch and omega8 at the points in infinity.'''
C = omega.curve C = omega.curve
omega.form = reduction(C, omega.form)
F = C.base_ring
delta = C.nb_of_pts_at_infty
m = C.exponent
if sum(omega.residue(place = i, prec = 50) for i in range(delta)) != 0:
raise ValueError(str(omega) + " has non zero residue!")
Fxy, Rxy, x, y = C.fct_field Fxy, Rxy, x, y = C.fct_field
Rx.<x> = PolynomialRing(F)
Fx = FractionField(Rx)
fct = Fxy(omega.form) fct = Fxy(omega.form)
num = fct.numerator() num = fct.numerator()
den = fct.denominator() den = fct.denominator()
aux_den = superelliptic_function(C, Rxy(den)) aux_den = superelliptic_function(C, Rxy(den))
g0 = superelliptic_function(C, 0) g0 = superelliptic_function(C, 0)
g8 = superelliptic_function(C, 0) g8 = superelliptic_function(C, 0)
dx_valuation = C.dx.expansion_at_infty(prec=prec).valuation() for j in range(0, m):
for monomial in num.monomials(): component = Fx(omega.jth_component(j))
aux = superelliptic_function(C, monomial) q, r = component.numerator().quo_rem(component.denominator())
if aux.expansion_at_infty(prec=prec).valuation() + dx_valuation >= aux_den.expansion_at_infty(prec=prec).valuation(): g0 += (C.y)^(-j)*superelliptic_function(C, Rxy(q))
g8 += num.monomial_coefficient(monomial)*aux/aux_den if ((C.y)^(-j)*superelliptic_function(C, Fxy(r/component.denominator()))*C.dx).expansion_at_infty().valuation() < 0:
else: raise ValueError("Something went wrong for "+str(omega))
g0 += num.monomial_coefficient(monomial)*aux/aux_den g8 -= (C.y)^(-j)*superelliptic_function(C, Fxy(r/component.denominator()))
g0, g8 = g0*C.dx, g8*C.dx g0, g8 = g0*C.dx, g8*C.dx
if g0.is_regular_on_U0(): if g0.is_regular_on_U0():
return (g0, g8) return (g0, g8)
#Rx.<x> = PolynomialRing(F)
#Rx.<x> = PolynomialRing(F)
#aux_fct = (g0.form)*y
else: else:
raise Error("Something went wrong.") raise ValueError("Something went wrong for "+str(omega) +". Result would be "+str(g0)+ " and " + str(g8))

View File

@ -71,7 +71,7 @@ class superelliptic_cech:
for j in range(1, m): for j in range(1, m):
fct_j = Fx(fct.jth_component(j)) fct_j = Fx(fct.jth_component(j))
if (fct_j != Rx(0)): if (fct_j != Rx(0)):
d = degree_of_rational_fctn(fct_j, p) d = degree_of_rational_fctn(fct_j, F)
if (d, j) in degrees1.values(): if (d, j) in degrees1.values():
index = degrees1_inv[(d, j)] index = degrees1_inv[(d, j)]

View File

@ -93,16 +93,14 @@ class superelliptic_form:
'''If self = sum_j h_j(x)/y^j dx, output is h_j(x).''' '''If self = sum_j h_j(x)/y^j dx, output is h_j(x).'''
g = self.form g = self.form
C = self.curve C = self.curve
m = C.exponent
F = C.base_ring F = C.base_ring
Rx.<x> = PolynomialRing(F) Rx.<x> = PolynomialRing(F)
Fx = FractionField(Rx) Fx = FractionField(Rx)
FxRy.<y> = PolynomialRing(Fx) FxRy.<y> = PolynomialRing(Fx)
Fxy = FractionField(FxRy) g = reduction(C, y^m*g)
Ryinv.<y_inv> = PolynomialRing(Fx) g = FxRy(g)
g = Fxy(g) return g.monomial_coefficient(y^(m-j))
g = g(y = 1/y_inv)
g = Ryinv(g)
return coff(g, j)
def is_regular_on_U0(self): def is_regular_on_U0(self):
C = self.curve C = self.curve
@ -136,6 +134,9 @@ class superelliptic_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) g = g.expansion_at_infty(place = place, prec=prec)
x_series = superelliptic_function(C, x).expansion_at_infty(place = place, prec=prec) x_series = C.x.expansion_at_infty(place = place, prec=prec)
dx_series = x_series.derivative() dx_series = x_series.derivative()
return g*dx_series return g*dx_series
def residue(self, place = 0, prec=30):
return self.expansion_at_infty(place = place, prec=prec)[-1]