From 0487c5217418e7285a30d321124b500a0cf2172a Mon Sep 17 00:00:00 2001 From: jgarnek Date: Thu, 13 Jun 2024 16:24:20 +0000 Subject: [PATCH] riemann roch spaces --- as_covers/as_cover_class.sage | 92 +++++++++++++++++++- elementary_covers/ith_magical_component.sage | 4 +- 2 files changed, 93 insertions(+), 3 deletions(-) diff --git a/as_covers/as_cover_class.sage b/as_covers/as_cover_class.sage index 6e47500..8527468 100644 --- a/as_covers/as_cover_class.sage +++ b/as_covers/as_cover_class.sage @@ -135,6 +135,18 @@ class as_cover: dd += [jumps[place][i-1]*(p-1) + p*dd[i-1]] return dd[n] + def exponent_of_different_bis(self, place = 0): + jumps = self.jumps + n = self.height + p = self.characteristic + dd = [0] + for i in range(1, n+1): + if jumps[place][i-1] == 0: + dd += [dd[i-1]] + else: + dd += [(jumps[place][i-1]-1)*(p-1) + p*dd[i-1]] + return dd[n] + def holomorphic_differentials_basis(self, threshold = 8): from itertools import product x_series = self.x_series @@ -544,4 +556,82 @@ class as_cover: def group_action_matrices_log_holo(AS): n = AS.height F = AS.base_ring - return as_group_action_matrices(F, AS.at_most_poles_forms(1), AS.group.gens, basis = AS.at_most_poles_forms(1)) \ No newline at end of file + return as_group_action_matrices(F, AS.at_most_poles_forms(1), AS.group.gens, basis = AS.at_most_poles_forms(1)) + + def riemann_roch_space(self, pole_orders, threshold = 8): + """ Find fcts with pole order in infty's at most pole_order from the given dictionary. The keys of the dictionary are pairs (place_at_infty, group element). The items are the poles orders at those places. + Threshold gives a bound on powers of x in the function. If you suspect that you haven't found all the functions, you may increase it.""" + from itertools import product + x_series = self.x_series + y_series = self.y_series + z_series = self.z_series + delta = self.nb_of_pts_at_infty + p = self.characteristic + n = self.height + prec = self.prec + C = self.quotient + F = self.base_ring + m = C.exponent + r = C.polynomial.degree() + RxyzQ, Rxyz, x, y, z = self.fct_field + F = C.base_ring + Rt. = LaurentSeriesRing(F, default_prec=prec) + #Tworzymy zbiór S form z^i x^j y^k dx/y o waluacji >= waluacja z^(p-1)*dx/y + S = [] + RQxyz = FractionField(Rxyz) + pr = [list(GF(p)) for _ in range(n)] + for i in range(0, threshold*r): + for j in range(0, m): + for k in product(*pr): + eta = as_function(self, x^i * prod(z[i1]^(k[i1]) for i1 in range(n))*y^j) + eta_exp = eta.expansion_at_infty() + S += [(eta, eta_exp)] + + forms = holomorphic_combinations_fcts(S, pole_orders[(0, self.group.one)]) + print('iteration') + for i in range(delta): + for g in self.fiber(place = i): + if i!=0 or g != self.group.one: + print('iteration') + forms = [(omega, omega.group_action(g).expansion_at_infty(place = i)) for omega in forms] + forms = holomorphic_combinations_fcts(forms, pole_orders[(i, g)]) + return forms + + def riemann_roch_space_forms(self, pole_orders, threshold = 8): + """ Find fcts with pole order in infty's at most pole_order from the given dictionary. The keys of the dictionary are pairs (place_at_infty, group element). The items are the poles orders at those places. + Threshold gives a bound on powers of x in the function. If you suspect that you haven't found all the functions, you may increase it.""" + from itertools import product + x_series = self.x_series + y_series = self.y_series + z_series = self.z_series + delta = self.nb_of_pts_at_infty + p = self.characteristic + n = self.height + prec = self.prec + C = self.quotient + F = self.base_ring + m = C.exponent + r = C.polynomial.degree() + RxyzQ, Rxyz, x, y, z = self.fct_field + F = C.base_ring + Rt. = LaurentSeriesRing(F, default_prec=prec) + #Tworzymy zbiór S form z^i x^j y^k dx/y o waluacji >= waluacja z^(p-1)*dx/y + S = [] + RQxyz = FractionField(Rxyz) + pr = [list(GF(p)) for _ in range(n)] + for i in range(0, threshold*r): + for j in range(0, m): + for k in product(*pr): + eta = heisenberg_form(self, x^i * prod(z[i1]^(k[i1]) for i1 in range(n))/y^j) + eta_exp = eta.expansion_at_infty() + S += [(eta, eta_exp)] + + forms = holomorphic_combinations_forms(S, pole_orders[(0, (0, 0, 0))]) + print('iteration') + for i in range(delta): + for g in self.fiber(place = i): + if i!=0 or g != self.group.one: + print('iteration') + forms = [(omega, omega.group_action(g).expansion_at_infty(place = i)) for omega in forms] + forms = holomorphic_combinations_forms(forms, pole_orders[(i, g)]) + return forms \ No newline at end of file diff --git a/elementary_covers/ith_magical_component.sage b/elementary_covers/ith_magical_component.sage index cfc6d54..a7fb1d4 100644 --- a/elementary_covers/ith_magical_component.sage +++ b/elementary_covers/ith_magical_component.sage @@ -1,6 +1,6 @@ -def ith_magical_component(omega, zvee, g): +def ith_magical_component(omega, zvee, g, super=True): '''Given a form omega on AS cover, element g of group AS.group and normal basis element zmag, find the decomposition sum_g g(zmag) omega_g and return omega_g.''' z_vee_g = zvee.group_action(g) new_form = z_vee_g*omega - return new_form.trace() \ No newline at end of file + return new_form.trace(super=super) \ No newline at end of file