quaternion template; fiber fixed

This commit is contained in:
jgarnek 2024-06-13 10:35:58 +00:00
parent 3d0e352a37
commit 63c189e753
4 changed files with 107 additions and 27 deletions

View File

@ -108,23 +108,32 @@ class as_cover:
jumps = self.jumps jumps = self.jumps
gY = self.quotient.genus() gY = self.quotient.genus()
n = self.height n = self.height
branch_pts = self.branch_points
p = self.characteristic 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): def exponent_of_different(self, place = 0):
jumps = self.jumps jumps = self.jumps
n = self.height n = self.height
delta = self.nb_of_pts_at_infty
p = self.characteristic 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): def exponent_of_different_prim(self, place = 0):
jumps = self.jumps jumps = self.jumps
n = self.height n = self.height
delta = self.nb_of_pts_at_infty
p = self.characteristic 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): def holomorphic_differentials_basis(self, threshold = 8):
from itertools import product from itertools import product
@ -160,7 +169,8 @@ class as_cover:
if len(forms) < self.genus(): if len(forms) < self.genus():
print("I haven't found all forms, only ", len(forms), " of ", 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(): if len(forms) > self.genus():
raise ValueError("Increase precision.") raise ValueError("Increase precision.")
return forms return forms
@ -283,11 +293,9 @@ class as_cover:
F = self.base_ring F = self.base_ring
rr_space = self.at_most_poles(threshold) rr_space = self.at_most_poles(threshold)
list_of_fcts = [ff for ff in rr_space if ff.valuation(place)%p != 0] 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] list_of_fcts2 = [len(str(ff)) for ff in list_of_fcts]
i_min = list_of_fcts2.index(min(list_of_fcts2)) i_min = list_of_fcts2.index(min(list_of_fcts2))
result = list_of_fcts.pop(i_min) result = list_of_fcts.pop(i_min)
print(result)
flag = 1 flag = 1
while flag == 1: while flag == 1:
flag = 0 flag = 0
@ -298,7 +306,6 @@ class as_cover:
list_of_fcts2 = [len(str(ff)) for ff in 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)) i_min = list_of_fcts2.index(min(list_of_fcts2))
result = list_of_fcts.pop(i_min) result = list_of_fcts.pop(i_min)
print(result)
return result return result
def stabilizer(self, place = 0): 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.' 'Gives representatives for the quotient G/G_P for given place. Those are in bijection with the fiber.'
result = [(0, 0, 0)] result = [(0, 0, 0)]
p = self.characteristic p = self.characteristic
G = self.group
H = self.stabilizer(place = place) H = self.stabilizer(place = place)
for g in self.group.elts: for g in self.group.elts:
flag = 1 flag = 1
for v in result: 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 flag = 0
if flag: if flag:
result += [g] result += [g]
@ -376,6 +384,15 @@ class as_cover:
i+=1 i+=1
return result 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): def a_number(self):
g = self.genus() g = self.genus()
return g - self.cartier_matrix().rank() return g - self.cartier_matrix().rank()

View File

@ -94,3 +94,28 @@ def heisenberg(p):
gens = [(1, 0, 0), (0, 1, 0), (0, 0, 1)] gens = [(1, 0, 0), (0, 1, 0), (0, 0, 1)]
gp = group(name, short_name, elts, one, mult, inv, gens) gp = group(name, short_name, elts, one, mult, inv, gens)
return gp 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

View File

@ -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)] gp_action = [[z[j] + (i == j) for j in range(n)] for i in range(n)]
return template(height, field, group, fcts, gp_action) 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): def heisenberg_template(p):
group = heisenberg(p) group = heisenberg(p)
field = GF(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]] 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) 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): def witt_pol(X, p, n):
n = len(X) n = len(X)
@ -134,3 +143,32 @@ def witt_template(p, n):
aux aux
gp_action = [gp_action] gp_action = [gp_action]
return template(height, field, group, fcts, gp_action) 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)

View File

@ -35,21 +35,21 @@ load('auxilliaries/laurent_analytic_part.sage')
#load('as_drw/as_witt.sage') #load('as_drw/as_witt.sage')
#load('as_drw/as_witt_form.sage') #load('as_drw/as_witt_form.sage')
#load('as_drw/as_compability.sage') #load('as_drw/as_compability.sage')
load('quaternion_covers/quaternion_covers.sage') #load('quaternion_covers/quaternion_covers.sage')
load('quaternion_covers/quaternion_function_class.sage') #load('quaternion_covers/quaternion_function_class.sage')
load('quaternion_covers/quaternion_form_class.sage') #load('quaternion_covers/quaternion_form_class.sage')
load('quaternion_covers/quaternion_polyforms.sage') #load('quaternion_covers/quaternion_polyforms.sage')
load('quaternion_covers/quaternion_reduction.sage') #load('quaternion_covers/quaternion_reduction.sage')
load('quaternion_covers/quaternion_group_action_matrices.sage') #load('quaternion_covers/quaternion_group_action_matrices.sage')
load('heisenberg_covers/heisenberg_covers.sage') #load('heisenberg_covers/heisenberg_covers.sage')
load('heisenberg_covers/heisenberg_function_class.sage') #load('heisenberg_covers/heisenberg_function_class.sage')
load('heisenberg_covers/heisenberg_form_class.sage') #load('heisenberg_covers/heisenberg_form_class.sage')
load('heisenberg_covers/heisenberg_polyforms.sage') #load('heisenberg_covers/heisenberg_polyforms.sage')
load('heisenberg_covers/heisenberg_reduction.sage') #load('heisenberg_covers/heisenberg_reduction.sage')
load('heisenberg_covers/heisenberg_group_action_matrices.sage') #load('heisenberg_covers/heisenberg_group_action_matrices.sage')
load('heisenberg_covers/dual_element.sage') #load('heisenberg_covers/dual_element.sage')
load('heisenberg_covers/ith_magical_component.sage') #load('heisenberg_covers/ith_magical_component.sage')
load('heisenberg_covers/heisenberg_group.sage') #load('heisenberg_covers/heisenberg_group.sage')
############## ##############
############## ##############
def init(lista, tests = False, init=True): def init(lista, tests = False, init=True):