diff --git a/as_covers/as_cover_class.sage b/as_covers/as_cover_class.sage index 3756a51..6e47500 100644 --- a/as_covers/as_cover_class.sage +++ b/as_covers/as_cover_class.sage @@ -108,23 +108,32 @@ class as_cover: jumps = self.jumps gY = self.quotient.genus() n = self.height - branch_pts = self.branch_points p = self.characteristic - return p^n*gY + (p^n - 1)*(len(branch_pts) - 1) + sum(p^(n-j-1)*(jumps[pt][j]-1)*(p-1)/2 for j in range(n) for pt in branch_pts) + return p^n*(gY-1) + 1 + 1/2*sum(self.exponent_of_different(place)*len(self.fiber(place)) for place in self.branch_points) def exponent_of_different(self, place = 0): jumps = self.jumps n = self.height - delta = self.nb_of_pts_at_infty p = self.characteristic - return sum(p^(n-j-1)*(jumps[place][j]+1)*(p-1) for j in range(n)) + 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 exponent_of_different_prim(self, place = 0): jumps = self.jumps n = self.height - delta = self.nb_of_pts_at_infty p = self.characteristic - return sum(p^(n-j-1)*(jumps[place][j])*(p-1) for j in range(n)) + 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]*(p-1) + p*dd[i-1]] + return dd[n] def holomorphic_differentials_basis(self, threshold = 8): from itertools import product @@ -160,7 +169,8 @@ class as_cover: if len(forms) < self.genus(): print("I haven't found all forms, only ", len(forms), " of ", self.genus()) - return holomorphic_differentials_basis(self, threshold = threshold + 1) + raise ValueError("Increase threshold.") + #return holomorphic_differentials_basis(self, threshold = threshold + 1) if len(forms) > self.genus(): raise ValueError("Increase precision.") return forms @@ -283,11 +293,9 @@ class as_cover: F = self.base_ring rr_space = self.at_most_poles(threshold) list_of_fcts = [ff for ff in rr_space if ff.valuation(place)%p != 0] - print(len(list_of_fcts)) list_of_fcts2 = [len(str(ff)) for ff in list_of_fcts] i_min = list_of_fcts2.index(min(list_of_fcts2)) result = list_of_fcts.pop(i_min) - print(result) flag = 1 while flag == 1: flag = 0 @@ -298,7 +306,6 @@ class as_cover: list_of_fcts2 = [len(str(ff)) for ff in list_of_fcts] i_min = list_of_fcts2.index(min(list_of_fcts2)) result = list_of_fcts.pop(i_min) - print(result) return result def stabilizer(self, place = 0): @@ -320,11 +327,12 @@ class as_cover: 'Gives representatives for the quotient G/G_P for given place. Those are in bijection with the fiber.' result = [(0, 0, 0)] p = self.characteristic + G = self.group H = self.stabilizer(place = place) for g in self.group.elts: flag = 1 for v in result: - if heisenberg_mult(g, heisenberg_inv(v, p), p) in H: + if (G.elt(g)*(-G.elt(v))).as_tuple in H: flag = 0 if flag: result += [g] @@ -376,6 +384,15 @@ class as_cover: i+=1 return result + def upper_ramification_jumps(self, place = 0, quasiuniformizer = 0, threshold = 20): + lj = self.ramification_jumps(place = place, quasiuniformizer = quasiuniformizer, threshold = threshold) + result = [] + result += [lj[0]] + for j in range(1, len(lj)): + aux = len(self.stabilizer(place=place))//len(self.ith_ramification_gp(lj[j], place = place, quasiuniformizer = quasiuniformizer, threshold = threshold)) + result += [result[j-1] + (lj[j] - lj[j-1])//aux] + return result + def a_number(self): g = self.genus() return g - self.cartier_matrix().rank() diff --git a/as_covers/group.sage b/as_covers/group.sage index f24f29f..231a5e9 100644 --- a/as_covers/group.sage +++ b/as_covers/group.sage @@ -93,4 +93,29 @@ def heisenberg(p): inv = lambda elt : (p-elt[0], p-elt[1], (p - elt[2] - (p-elt[0])*(p-elt[1]))%p) gens = [(1, 0, 0), (0, 1, 0), (0, 0, 1)] gp = group(name, short_name, elts, one, mult, inv, gens) + return gp + +def quaternion_mult(aa, bb): + result = [(aa[0] + bb[0] + 2*aa[1]*bb[0])%4, (aa[1]+bb[1])%4] + if result[1]%4 == 2 or result[1]%4 == 3: + result[0] = (result[0] + 2)%4 + result[1] = (result[1] - 2)%4 + return tuple(result) + +def quaternion_inv(aa): + result = [((-1)^(aa[0]*aa[1])*(-aa[0]))%4, (-aa[1])%4] + if result[1]%4 == 2 or result[1]%4 == 3: + result[0] = (result[0] + 2)%4 + result[1] = (result[1] - 2)%4 + return tuple(result) + +def quaternion_gp(): + name = "Q8" + short_name = name + elts = [(i, j) for i in range(4) for j in range(2)] + mult = quaternion_mult + inv = quaternion_inv + gens = [(1, 0), (0, 1)] + one = (0, 0) + gp = group(name, short_name, elts, one, mult, inv, gens) return gp \ No newline at end of file diff --git a/as_covers/template.sage b/as_covers/template.sage index 95c0bd4..3e5c02e 100644 --- a/as_covers/template.sage +++ b/as_covers/template.sage @@ -37,6 +37,11 @@ def elementary_template(p, n): gp_action = [[z[j] + (i == j) for j in range(n)] for i in range(n)] return template(height, field, group, fcts, gp_action) +def elementary_cover(list_of_fcts, prec=10): + n = len(list_of_fcts) + C = list_of_fcts[0].curve + return as_cover(C, elementary_template(p, n), list_of_fcts, branch_points = [], prec = prec) + def heisenberg_template(p): group = heisenberg(p) field = GF(p) @@ -57,6 +62,10 @@ def heisenberg_template(p): gp_action = [[z[0] + 1, z[1], z[2] + z[1]], [z[0] + 1, z[1] + 1, z[2]], [z[0], z[1], z[2] - 1]] return template(height, field, group, fcts, gp_action) +def heisenberg_cover(list_of_fcts, prec=10): + n = len(list_of_fcts) + C = list_of_fcts[0].curve + return as_cover(C, heisenberg_template(p), list_of_fcts, branch_points = [], prec = prec) def witt_pol(X, p, n): n = len(X) @@ -133,4 +142,33 @@ def witt_template(p, n): ######## aux gp_action = [gp_action] - return template(height, field, group, fcts, gp_action) \ No newline at end of file + return template(height, field, group, fcts, gp_action) + +def witt_cover(list_of_fcts, prec=10): + n = len(list_of_fcts) + C = list_of_fcts[0].curve + return as_cover(C, witt_template(p, n), list_of_fcts, branch_points = [], prec = prec) + +def quaternion_template(): + field = GF(2) + height = 3 + n = 3 + variable_names = '' + for i in range(n): + variable_names += 'z'+str(i)+',' + for i in range(n): + variable_names += 'f'+str(i) + if i!=n-1: + variable_names += ',' + R = PolynomialRing(field, 2*n, variable_names) + z = R.gens()[:n] + f = R.gens()[n:] + group = quaternion_gp() + fcts = [f[0], f[1], f[2] + z[0]*f[0]+z[1]*(f[0] + f[1])] + gp_action = [[z[0]+1, z[1], z[2] + z[0]], [z[0], z[1] + 1, z[2] + z[1] + z[0]]] + return template(height, field, group, fcts, gp_action) + +def quaternion_cover(list_of_fcts, prec=10): + n = len(list_of_fcts) + C = list_of_fcts[0].curve + return as_cover(C, quaternion_template(), list_of_fcts, branch_points = [], prec = prec) \ No newline at end of file diff --git a/init.sage b/init.sage index b94d798..64d20da 100644 --- a/init.sage +++ b/init.sage @@ -35,21 +35,21 @@ load('auxilliaries/laurent_analytic_part.sage') #load('as_drw/as_witt.sage') #load('as_drw/as_witt_form.sage') #load('as_drw/as_compability.sage') -load('quaternion_covers/quaternion_covers.sage') -load('quaternion_covers/quaternion_function_class.sage') -load('quaternion_covers/quaternion_form_class.sage') -load('quaternion_covers/quaternion_polyforms.sage') -load('quaternion_covers/quaternion_reduction.sage') -load('quaternion_covers/quaternion_group_action_matrices.sage') -load('heisenberg_covers/heisenberg_covers.sage') -load('heisenberg_covers/heisenberg_function_class.sage') -load('heisenberg_covers/heisenberg_form_class.sage') -load('heisenberg_covers/heisenberg_polyforms.sage') -load('heisenberg_covers/heisenberg_reduction.sage') -load('heisenberg_covers/heisenberg_group_action_matrices.sage') -load('heisenberg_covers/dual_element.sage') -load('heisenberg_covers/ith_magical_component.sage') -load('heisenberg_covers/heisenberg_group.sage') +#load('quaternion_covers/quaternion_covers.sage') +#load('quaternion_covers/quaternion_function_class.sage') +#load('quaternion_covers/quaternion_form_class.sage') +#load('quaternion_covers/quaternion_polyforms.sage') +#load('quaternion_covers/quaternion_reduction.sage') +#load('quaternion_covers/quaternion_group_action_matrices.sage') +#load('heisenberg_covers/heisenberg_covers.sage') +#load('heisenberg_covers/heisenberg_function_class.sage') +#load('heisenberg_covers/heisenberg_form_class.sage') +#load('heisenberg_covers/heisenberg_polyforms.sage') +#load('heisenberg_covers/heisenberg_reduction.sage') +#load('heisenberg_covers/heisenberg_group_action_matrices.sage') +#load('heisenberg_covers/dual_element.sage') +#load('heisenberg_covers/ith_magical_component.sage') +#load('heisenberg_covers/heisenberg_group.sage') ############## ############## def init(lista, tests = False, init=True):