quaternion template; fiber fixed
This commit is contained in:
parent
3d0e352a37
commit
63c189e753
@ -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()
|
||||||
|
@ -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
|
@ -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)
|
30
init.sage
30
init.sage
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user