From 3843cfa550bc557e768cfa44e87e8982577d37ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Garnek?= Date: Thu, 2 Jan 2025 18:17:52 +0100 Subject: [PATCH] partially fixed issue with de Rham basis and coordinates for more than one place at infty --- as_covers/as_cech_class.sage | 21 ++++++++++--------- as_covers/as_cover_class.sage | 1 + as_covers/as_form_class.sage | 15 +++++++++---- as_covers/group_action_matrices.sage | 6 +++++- as_covers/template.sage | 1 + superelliptic/superelliptic_cech_class.sage | 20 +++++++++--------- superelliptic/superelliptic_form_class.sage | 2 -- .../superelliptic_function_class.sage | 10 ++++----- 8 files changed, 43 insertions(+), 33 deletions(-) diff --git a/as_covers/as_cech_class.sage b/as_covers/as_cech_class.sage index fb636f0..3a0d5a7 100644 --- a/as_covers/as_cech_class.sage +++ b/as_covers/as_cech_class.sage @@ -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): diff --git a/as_covers/as_cover_class.sage b/as_covers/as_cover_class.sage index a1aac18..6c0870c 100644 --- a/as_covers/as_cover_class.sage +++ b/as_covers/as_cover_class.sage @@ -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): diff --git a/as_covers/as_form_class.sage b/as_covers/as_form_class.sage index 49875ad..18e6549 100644 --- a/as_covers/as_form_class.sage +++ b/as_covers/as_form_class.sage @@ -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() diff --git a/as_covers/group_action_matrices.sage b/as_covers/group_action_matrices.sage index bcc9762..6a4240c 100644 --- a/as_covers/group_action_matrices.sage +++ b/as_covers/group_action_matrices.sage @@ -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) diff --git a/as_covers/template.sage b/as_covers/template.sage index dbd2c4d..a19c909 100644 --- a/as_covers/template.sage +++ b/as_covers/template.sage @@ -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): diff --git a/superelliptic/superelliptic_cech_class.sage b/superelliptic/superelliptic_cech_class.sage index 58bb2d7..dbad085 100644 --- a/superelliptic/superelliptic_cech_class.sage +++ b/superelliptic/superelliptic_cech_class.sage @@ -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. = 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 diff --git a/superelliptic/superelliptic_form_class.sage b/superelliptic/superelliptic_form_class.sage index 11ee840..ad1b3df 100644 --- a/superelliptic/superelliptic_form_class.sage +++ b/superelliptic/superelliptic_form_class.sage @@ -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): diff --git a/superelliptic/superelliptic_function_class.sage b/superelliptic/superelliptic_function_class.sage index ba35557..c56a2df 100644 --- a/superelliptic/superelliptic_function_class.sage +++ b/superelliptic/superelliptic_function_class.sage @@ -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