riemann roch spaces

This commit is contained in:
jgarnek 2024-06-13 16:24:20 +00:00
parent 73372ac15d
commit 0487c52174
2 changed files with 93 additions and 3 deletions

View File

@ -135,6 +135,18 @@ class as_cover:
dd += [jumps[place][i-1]*(p-1) + p*dd[i-1]] dd += [jumps[place][i-1]*(p-1) + p*dd[i-1]]
return dd[n] 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): def holomorphic_differentials_basis(self, threshold = 8):
from itertools import product from itertools import product
x_series = self.x_series x_series = self.x_series
@ -545,3 +557,81 @@ class as_cover:
n = AS.height n = AS.height
F = AS.base_ring 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)) 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.<t> = 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.<t> = 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

View File

@ -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 '''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.''' sum_g g(zmag) omega_g and return omega_g.'''
z_vee_g = zvee.group_action(g) z_vee_g = zvee.group_action(g)
new_form = z_vee_g*omega new_form = z_vee_g*omega
return new_form.trace() return new_form.trace(super=super)