partially fixed issue with de Rham basis and coordinates for more than one place at infty

This commit is contained in:
Jędrzej Garnek 2025-01-02 18:17:52 +01:00
parent aebf8c0a5b
commit 3843cfa550
8 changed files with 43 additions and 33 deletions

View File

@ -58,6 +58,7 @@ class as_cech:
r = C.polynomial.degree()
n = AS.height
p = AS.characteristic
delta = AS.nb_of_pts_at_infty
RxyzQ, Rxyz, x, y, z = AS.fct_field
if basis == 0:
basis = [AS.holomorphic_differentials_basis(), AS.cohomology_of_structure_sheaf_basis(), AS.de_rham_basis(threshold=threshold)]
@ -65,15 +66,8 @@ class as_cech:
coh_basis = basis[1]
dR = basis[2]
F = AS.base_ring
f_products = []
for f in coh_basis:
f_products += [[omega.serre_duality_pairing(f) for omega in holo_diffs]]
product_of_fct_and_omegas = []
fct = self.f
product_of_fct_and_omegas = [omega.serre_duality_pairing(fct) for omega in holo_diffs]
V = (F^(AS.genus())).span_of_basis([vector(a) for a in f_products])
coh_coordinates = V.coordinates(product_of_fct_and_omegas) #coeficients of self in the basis elts coming from cohomology of OX
coh_coordinates = fct.coordinates(basis = [holo_diffs, coh_basis]) #coeficients of self in the basis elts coming from cohomology of OX
for i in range(AS.genus()):
self -= coh_coordinates[i]*dR[i+AS.genus()]
coh_coordinates = AS.genus()*[0] + list(coh_coordinates)
@ -88,8 +82,15 @@ class as_cech:
g = (AS.x)^i*prod((AS.z[i1])^(k[i1]) for i1 in range(n))*(AS.y)^j
S += [(g, g.expansion_at_infty())]
S += [(self.f, self.f.expansion_at_infty())]
fcts = holomorphic_combinations_fcts(S, 0)
for g in fcts:
S = holomorphic_combinations_fcts(S, 0)
########
for i in range(delta):
for g in AS.fiber(place = i):
if i!=0 or g != AS.group.one:
S = [(omega, omega.group_action(g).expansion_at_infty(place = i)) for omega in S]
S = holomorphic_combinations_fcts(S, 0)
######
for g in S:
if g.function not in Rxyz:
for a in F:
if (self.f.function - a*g.function in Rxyz):

View File

@ -188,6 +188,7 @@ class as_cover:
if len(forms) > self.genus():
print(len(forms), forms)
raise ValueError("Increase precision.")
forms = [om.reduce() for om in forms]
return forms
def cartier_matrix(self, prec=50):

View File

@ -69,10 +69,15 @@ class as_form:
def reduce(self):
RxyzQ, Rxyz, x, y, z = self.curve.fct_field
m = self.curve.quotient.exponent
aux = as_reduction(self.curve, RxyzQ(y^m*self.form))
return as_form(self.curve, aux/y^m)
#aux = as_reduction(self.curve, RxyzQ(self.form))
#return as_form(self.curve, aux)
#!!!! Problem: how to reduce?
#####
#####
# OLD VERSION:
#aux = as_reduction(self.curve, RxyzQ(y^m*self.form))
#return as_form(self.curve, aux/y^m)
# NEW VERSION:
aux = as_reduction(self.curve, RxyzQ(self.form))
return as_form(self.curve, aux)
def group_action(self, elt):
C = self.curve
@ -83,7 +88,9 @@ class as_form:
def coordinates(self, basis = 0):
"""Find coordinates of the given holomorphic form self in terms of the basis forms in a list holo."""
print(self)
self = self.reduce()
print('s reduce', self)
C = self.curve
if basis == 0:
basis = C.holomorphic_differentials_basis()

View File

@ -1,9 +1,13 @@
def as_group_action_matrices(F, space, list_of_group_elements, basis):
def as_group_action_matrices(F, space, list_of_group_elements, basis, info = 0):
n = len(list_of_group_elements)
d = len(space)
A = [matrix(F, d, d) for i in range(n)]
for i, g in enumerate(list_of_group_elements):
if info:
print("Matrix for group elt", g)
for j, omega in enumerate(space):
if info:
print("coordinates of element " + str(j+1)+" out of " + str(len(space)))
omega1 = omega.group_action(g)
v1 = omega1.coordinates(basis = basis)
A[i][:, j] = vector(v1)

View File

@ -43,6 +43,7 @@ def elementary_template(p, n):
def elementary_cover(list_of_fcts, prec=10):
n = len(list_of_fcts)
C = list_of_fcts[0].curve
p = C.characteristic
return as_cover(C, elementary_template(p, n), list_of_fcts, branch_points = [], prec = prec)
def heisenberg_template(p):

View File

@ -39,7 +39,6 @@ class superelliptic_cech:
return superelliptic_cech(C, superelliptic_form(C, Rx(0)), superelliptic_function(C, fct^p))
def coordinates(self, basis = 0):
print('coord', self, self.omega8.valuation())
C = self.curve
F = C.base_ring
m = C.exponent
@ -48,8 +47,12 @@ class superelliptic_cech:
FxRy.<y> = PolynomialRing(Fx)
g = C.genus()
if basis == 0:
basis = C.de_rham_basis()
basis_dR = C.de_rham_basis()
basis_h = C.holomorphic_differentials_basis()
basis_s = C.cohomology_of_structure_sheaf_basis()
else:
basis_h, basis_s, basis_dR = basis
omega = self.omega0
fct = self.f
@ -57,24 +60,21 @@ class superelliptic_cech:
return vector((2*g)*[0])
if fct.function == Rx(0) and omega.form != Rx(0):
print('A')
result = list(omega.coordinates()) + g*[0]
result = list(omega.coordinates(basis = Bh)) + g*[0]
result = vector([F(a) for a in result])
return result
coord = fct.coordinates()
coord = fct.coordinates(basis = basis_h)
coord = g*[0] + list(coord)
coord = vector([F(a) for a in coord])
aux = self
for i in range(g, 2*g):
aux -= coord[i]*basis[i]
aux -= coord[i]*basis_dR[i]
aux_f = decomposition_g0_g8(aux.f)[0]
print('aux_f', aux_f, 'aux.f', aux.f)
aux.omega0 -= aux_f.diffn()
aux.f = 0*C.x
aux.omega8 = aux.omega0
print('B', aux)
return coord + aux.coordinates()
return coord + aux.coordinates(basis = basis)
def is_cocycle(self):
w0 = self.omega0

View File

@ -91,7 +91,6 @@ class superelliptic_form:
return -result
def coordinates(self, basis = 0):
print('start', self)
"""Find coordinates of the given holomorphic form self in terms of the basis forms in a list holo."""
C = self.curve
if basis == 0:
@ -102,7 +101,6 @@ class superelliptic_form:
denom = LCM([denominator(omega.form) for omega in basis])
basis = [denom*omega.form for omega in basis]
self_with_no_denominator = denom*self.form
print('stop', self_with_no_denominator)
return linear_representation_polynomials(Rxy(self_with_no_denominator), [Rxy(omega) for omega in basis])
def jth_component(self, j):

View File

@ -94,16 +94,14 @@ class superelliptic_function:
B = g.derivative(y)*f.derivative(x)/(m*y^(m-1))
return superelliptic_form(C, A+B)
def coordinates(self, basis = 0, basis_holo = 0, prec=50):
'''Find coordinates in H1(X, OX) in given basis basis with dual basis basis_holo.'''
def coordinates(self, basis = 0, prec=50):
'''Find coordinates in H1(X, OX) in given basis dual to basis *basis*.'''
C = self.curve
if basis == 0:
basis = C.cohomology_of_structure_sheaf_basis()
if basis_holo == 0:
basis_holo = C.holomorphic_differentials_basis()
basis = C.holomorphic_differentials_basis()
g = C.genus()
coordinates = g*[0]
for i, omega in enumerate(basis_holo):
for i, omega in enumerate(basis):
coordinates[i] = omega.serre_duality_pairing(self, prec=prec)
return coordinates