trying to fix superelliptic cech coordinates
This commit is contained in:
parent
fc5810d546
commit
85b0edd5d7
@ -84,7 +84,6 @@ class as_form:
|
|||||||
def coordinates(self, basis = 0):
|
def coordinates(self, basis = 0):
|
||||||
"""Find coordinates of the given holomorphic form self in terms of the basis forms in a list holo."""
|
"""Find coordinates of the given holomorphic form self in terms of the basis forms in a list holo."""
|
||||||
self = self.reduce()
|
self = self.reduce()
|
||||||
print(self)
|
|
||||||
C = self.curve
|
C = self.curve
|
||||||
if basis == 0:
|
if basis == 0:
|
||||||
basis = C.holomorphic_differentials_basis()
|
basis = C.holomorphic_differentials_basis()
|
||||||
@ -94,7 +93,6 @@ class as_form:
|
|||||||
denom = LCM([denominator(omega.form) for omega in basis])
|
denom = LCM([denominator(omega.form) for omega in basis])
|
||||||
basis = [denom*omega for omega in basis]
|
basis = [denom*omega for omega in basis]
|
||||||
self_with_no_denominator = denom*self
|
self_with_no_denominator = denom*self
|
||||||
print(denom, basis, self_with_no_denominator)
|
|
||||||
return linear_representation_polynomials(Rxyz(self_with_no_denominator.form), [Rxyz(omega.form) for omega in basis])
|
return linear_representation_polynomials(Rxyz(self_with_no_denominator.form), [Rxyz(omega.form) for omega in basis])
|
||||||
|
|
||||||
def trace(self, super=True):
|
def trace(self, super=True):
|
||||||
|
166
drafty/mumford_curve.sage
Normal file
166
drafty/mumford_curve.sage
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
def mumford_gp(p):
|
||||||
|
'''We want m | p-1 and b to be of order m in F_p.'''
|
||||||
|
name = "Mumford group (Z/"+str(p)+")^2⋊ D"+str(p-1)
|
||||||
|
short_name = "(Z/"+str(p)+")^2 ⋊ D"+str(p-1)
|
||||||
|
elts = [(i, j, s, t) for i in range(p) for j in range(p) for s in range(1) for t in range(p-1)]
|
||||||
|
mult = lambda elt1, elt2: (0, 0, 0, 0)
|
||||||
|
inv = lambda elt1 : (0, 0, 0, 0)
|
||||||
|
gens = [(1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0,0,0,1)]
|
||||||
|
one = (0, 0, 0, 0)
|
||||||
|
gp = group(name, short_name, elts, one, mult, inv, gens)
|
||||||
|
return gp
|
||||||
|
|
||||||
|
def mumford_template(p):
|
||||||
|
group = mumford_gp(p)
|
||||||
|
field = GF(p)
|
||||||
|
n = 2
|
||||||
|
variable_names = ''
|
||||||
|
for i in range(n):
|
||||||
|
variable_names += 'z'+str(i)+','
|
||||||
|
for i in range(n):
|
||||||
|
variable_names += 'f'+str(i) + ','
|
||||||
|
variable_names += 'x, y'
|
||||||
|
R = PolynomialRing(field, 2*n+2, variable_names)
|
||||||
|
z = R.gens()[:n]
|
||||||
|
f = R.gens()[n:]
|
||||||
|
x = R.gens()[-2]
|
||||||
|
y = R.gens()[-1]
|
||||||
|
height = n
|
||||||
|
fcts = [x + y, x - y]
|
||||||
|
gp_action = [[z[j] + (i == j) for j in range(n)]+[x, y] for i in range(n)]
|
||||||
|
gp_action += [[z[1], z[0], -x, y]]
|
||||||
|
d = field(primitive_root(p))
|
||||||
|
gp_action += [[d*z[0], d^(-1)*z[1], 1/d*(y+x) - d*(y-x), 1/d*(y+x) + d*(y-x)]]
|
||||||
|
return template(height, field, group, fcts, gp_action)
|
||||||
|
|
||||||
|
def mumford_cover(p, prec=10):
|
||||||
|
field = GF(p)
|
||||||
|
R.<x> = PolynomialRing(field)
|
||||||
|
C = superelliptic(x^2 + 1, 2)
|
||||||
|
return as_cover(C, mumford_template(p), [C.x, C.x], branch_points = [], prec = prec)
|
||||||
|
|
||||||
|
ASM = mumford_cover(3, prec = 400)
|
||||||
|
|
||||||
|
|
||||||
|
###############
|
||||||
|
###############
|
||||||
|
def metacyclic_gp(p, c):
|
||||||
|
name = "metacyclic group Z/"+str(p)+"⋊ Z/"+str(c)
|
||||||
|
short_name = "Z/"+str(p)+" ⋊ Z/"+str(c)
|
||||||
|
elts = [(i, j) for i in range(p) for j in range(c)]
|
||||||
|
mult = lambda elt1, elt2: (0, 0)
|
||||||
|
inv = lambda elt1 : (0, 0)
|
||||||
|
gens = [(1, 0), (0, 1)]
|
||||||
|
one = (0, 0)
|
||||||
|
gp = group(name, short_name, elts, one, mult, inv, gens)
|
||||||
|
return gp
|
||||||
|
|
||||||
|
def metacyclic_template(p, m, nn):
|
||||||
|
group = metacyclic_gp(p, m*(p-1))
|
||||||
|
N = Integers(m*(p-1))(p).multiplicative_order()
|
||||||
|
field.<a> = GF(p^N)
|
||||||
|
zeta = a^((p^N - 1)/((p-1)*m))
|
||||||
|
n = 1
|
||||||
|
variable_names = ''
|
||||||
|
for i in range(n):
|
||||||
|
variable_names += 'z'+str(i)+','
|
||||||
|
for i in range(n):
|
||||||
|
variable_names += 'f'+str(i) + ','
|
||||||
|
variable_names += 'x, y'
|
||||||
|
R = PolynomialRing(field, 2*n+2, variable_names)
|
||||||
|
z = R.gens()[:n]
|
||||||
|
f = R.gens()[n:]
|
||||||
|
x = R.gens()[-2]
|
||||||
|
y = R.gens()[-1]
|
||||||
|
height = n
|
||||||
|
fcts = [x]
|
||||||
|
gp_action = [[z[j] + (i == j) for j in range(n)]+[x, y] for i in range(n)]
|
||||||
|
gp_action += [[zeta^m * z[0], zeta^m * x, zeta * y]]
|
||||||
|
return template(height, field, group, fcts, gp_action)
|
||||||
|
|
||||||
|
def metacyclic_cover(p, m, nn, prec=10):
|
||||||
|
N = Integers(m*(p-1))(p).multiplicative_order()
|
||||||
|
field.<a> = GF(p^N)
|
||||||
|
R.<x> = PolynomialRing(field)
|
||||||
|
C = superelliptic(sum(x^(p^i) for i in range(0, nn)), m)
|
||||||
|
return as_cover(C, metacyclic_template(p, m, nn), [C.x], branch_points = [], prec = prec)
|
||||||
|
|
||||||
|
p = 3
|
||||||
|
m = 2
|
||||||
|
nn = 2
|
||||||
|
N = Integers(m*(p-1))(p).multiplicative_order()
|
||||||
|
field.<a> = GF(p^N)
|
||||||
|
zeta = a^((p^N - 1)/((p-1)*m))
|
||||||
|
AS = metacyclic_cover(p, m, nn, prec=100)
|
||||||
|
Bh = AS.holomorphic_differentials_basis(threshold = 30)
|
||||||
|
Bs = AS.cohomology_of_structure_sheaf_basis(threshold = 30)
|
||||||
|
BdR = AS.de_rham_basis(threshold = 30)
|
||||||
|
print(Bh[2].group_action((1, 0)).coordinates(basis = Bh))
|
||||||
|
|
||||||
|
|
||||||
|
#H = CyclicPermutationGroup(4)
|
||||||
|
|
||||||
|
#alpha = PermutationGroupMorphism(A,A,[A.gens()[0]^3*A.gens()[1],A.gens()[1]])
|
||||||
|
|
||||||
|
#phi = [[(1,2)],[alpha]]
|
||||||
|
|
||||||
|
p = 3
|
||||||
|
m = 2
|
||||||
|
nn = 2
|
||||||
|
N = Integers(m*(p-1))(p).multiplicative_order()
|
||||||
|
field.<a> = GF(p^N)
|
||||||
|
zeta = a^((p^N - 1)/((p-1)*m))
|
||||||
|
|
||||||
|
def gp_action(fct, elt):
|
||||||
|
if elt == (1, 0):
|
||||||
|
if isinstance(fct, superelliptic_function):
|
||||||
|
f = fct.function
|
||||||
|
C = fct.curve
|
||||||
|
Fxy, Rxy, x, y = C.fct_field
|
||||||
|
f = f.subs({x: x+1, y: y})
|
||||||
|
return superelliptic_function(C, f)
|
||||||
|
|
||||||
|
if isinstance(fct, superelliptic_form):
|
||||||
|
f = fct.form
|
||||||
|
C = fct.curve
|
||||||
|
Fxy, Rxy, x, y = C.fct_field
|
||||||
|
f = f.subs({x: x+1, y: y})
|
||||||
|
return superelliptic_form(C, f)
|
||||||
|
|
||||||
|
if isinstance(fct, superelliptic_cech):
|
||||||
|
omega = fct.omega0
|
||||||
|
ff = fct.f
|
||||||
|
C = fct.curve
|
||||||
|
return superelliptic_cech(C, gp_action(omega, elt), gp_action(ff, elt))
|
||||||
|
if elt == (0, 1):
|
||||||
|
if isinstance(fct, superelliptic_function):
|
||||||
|
f = fct.function
|
||||||
|
C = fct.curve
|
||||||
|
Fxy, Rxy, x, y = C.fct_field
|
||||||
|
f = f.subs({x : zeta^m*x, y:zeta*y})
|
||||||
|
return superelliptic_function(C, f)
|
||||||
|
|
||||||
|
if isinstance(fct, superelliptic_form):
|
||||||
|
f = fct.form
|
||||||
|
C = fct.curve
|
||||||
|
Fxy, Rxy, x, y = C.fct_field
|
||||||
|
f = f.subs({x : zeta^m*x, y:zeta*y})
|
||||||
|
return superelliptic_form(C, f*zeta^m)
|
||||||
|
|
||||||
|
if isinstance(fct, superelliptic_cech):
|
||||||
|
omega = fct.omega0
|
||||||
|
ff = fct.f
|
||||||
|
C = fct.curve
|
||||||
|
return superelliptic_cech(C, gp_action(omega, elt), gp_action(ff, elt))
|
||||||
|
|
||||||
|
|
||||||
|
superelliptic_function.group_action = gp_action
|
||||||
|
superelliptic_form.group_action = gp_action
|
||||||
|
superelliptic_cech.group_action = gp_action
|
||||||
|
|
||||||
|
R.<x> = PolynomialRing(field)
|
||||||
|
C = superelliptic(x^(p^nn) - x, m)
|
||||||
|
Bh = C.holomorphic_differentials_basis()
|
||||||
|
Bs = C.cohomology_of_structure_sheaf_basis()
|
||||||
|
BdR = C.de_rham_basis()
|
||||||
|
mat = as_group_action_matrices(field, BdR, [(1, 0), (0, 1)], BdR)
|
@ -38,7 +38,8 @@ class superelliptic_cech:
|
|||||||
Rx.<x> = PolynomialRing(F)
|
Rx.<x> = PolynomialRing(F)
|
||||||
return superelliptic_cech(C, superelliptic_form(C, Rx(0)), superelliptic_function(C, fct^p))
|
return superelliptic_cech(C, superelliptic_form(C, Rx(0)), superelliptic_function(C, fct^p))
|
||||||
|
|
||||||
def coordinates(self):
|
def coordinates(self, basis = 0):
|
||||||
|
print('coord', self, self.omega8.valuation())
|
||||||
C = self.curve
|
C = self.curve
|
||||||
F = C.base_ring
|
F = C.base_ring
|
||||||
m = C.exponent
|
m = C.exponent
|
||||||
@ -46,7 +47,8 @@ class superelliptic_cech:
|
|||||||
Fx = FractionField(Rx)
|
Fx = FractionField(Rx)
|
||||||
FxRy.<y> = PolynomialRing(Fx)
|
FxRy.<y> = PolynomialRing(Fx)
|
||||||
g = C.genus()
|
g = C.genus()
|
||||||
basis = C.de_rham_basis()
|
if basis == 0:
|
||||||
|
basis = C.de_rham_basis()
|
||||||
|
|
||||||
omega = self.omega0
|
omega = self.omega0
|
||||||
fct = self.f
|
fct = self.f
|
||||||
@ -55,6 +57,7 @@ class superelliptic_cech:
|
|||||||
return vector((2*g)*[0])
|
return vector((2*g)*[0])
|
||||||
|
|
||||||
if fct.function == Rx(0) and omega.form != Rx(0):
|
if fct.function == Rx(0) and omega.form != Rx(0):
|
||||||
|
print('A')
|
||||||
result = list(omega.coordinates()) + g*[0]
|
result = list(omega.coordinates()) + g*[0]
|
||||||
result = vector([F(a) for a in result])
|
result = vector([F(a) for a in result])
|
||||||
return result
|
return result
|
||||||
@ -66,9 +69,11 @@ class superelliptic_cech:
|
|||||||
for i in range(g, 2*g):
|
for i in range(g, 2*g):
|
||||||
aux -= coord[i]*basis[i]
|
aux -= coord[i]*basis[i]
|
||||||
aux_f = decomposition_g0_g8(aux.f)[0]
|
aux_f = decomposition_g0_g8(aux.f)[0]
|
||||||
|
print('aux_f', aux_f, 'aux.f', aux.f)
|
||||||
aux.omega0 -= aux_f.diffn()
|
aux.omega0 -= aux_f.diffn()
|
||||||
aux.f = 0*C.x
|
aux.f = 0*C.x
|
||||||
aux.omega8 = aux.omega0
|
aux.omega8 = aux.omega0
|
||||||
|
print('B', aux)
|
||||||
return coord + aux.coordinates()
|
return coord + aux.coordinates()
|
||||||
|
|
||||||
def is_cocycle(self):
|
def is_cocycle(self):
|
||||||
|
@ -92,27 +92,37 @@ class superelliptic:
|
|||||||
f = self.polynomial
|
f = self.polynomial
|
||||||
m = self.exponent
|
m = self.exponent
|
||||||
r = f.degree()
|
r = f.degree()
|
||||||
|
genus = self.genus()
|
||||||
delta = GCD(r, m)
|
delta = GCD(r, m)
|
||||||
F = self.base_ring
|
F = self.base_ring
|
||||||
Rx.<x> = PolynomialRing(F)
|
Rx.<x> = PolynomialRing(F)
|
||||||
Rxy.<x, y> = PolynomialRing(F, 2)
|
Rxy.<x, y> = PolynomialRing(F, 2)
|
||||||
Fxy = FractionField(Rxy)
|
Fxy = FractionField(Rxy)
|
||||||
basis_holo = self.holomorphic_differentials_basis()
|
basis_holo = self.holomorphic_differentials_basis()
|
||||||
basis = []
|
basis = 2*genus*[0]
|
||||||
|
index = 0
|
||||||
#First g_X elements of basis are holomorphic differentials.
|
#First g_X elements of basis are holomorphic differentials.
|
||||||
for k in range(0, len(basis_holo)):
|
for k in range(0, len(basis_holo)):
|
||||||
basis += [superelliptic_cech(self, basis_holo[k], superelliptic_function(self, 0))]
|
basis[index] = superelliptic_cech(self, basis_holo[k], superelliptic_function(self, 0))
|
||||||
|
index += 1
|
||||||
|
|
||||||
## Next elements do not come from holomorphic differentials.
|
## Next elements do not come from holomorphic differentials.
|
||||||
t = len(basis)
|
t = len(basis)
|
||||||
degrees0 = {}
|
degrees0 = {}
|
||||||
degrees1 = {}
|
degrees1 = {}
|
||||||
|
degrees = self.degrees_holomorphic_differentials()
|
||||||
|
degrees_inv = {b:a for a, b in degrees.items()}
|
||||||
for j in range(1, m):
|
for j in range(1, m):
|
||||||
for i in range(1, r):
|
for i in range(1, r):
|
||||||
if (r*(m-j) - m*i >= delta):
|
if (r*(m-j) - m*i >= delta):
|
||||||
|
#########
|
||||||
|
index = degrees_inv[(i-1, m-j)]
|
||||||
|
fct = superelliptic_function(self, Fxy(m*y^(m-j)/x^i))
|
||||||
|
constant = self.holomorphic_differentials_basis()[index].serre_duality_pairing(fct)
|
||||||
|
#######
|
||||||
s = Rx(m-j)*Rx(x)*Rx(f.derivative()) - Rx(m)*Rx(i)*f
|
s = Rx(m-j)*Rx(x)*Rx(f.derivative()) - Rx(m)*Rx(i)*f
|
||||||
psi = Rx(cut(s, i))
|
psi = Rx(cut(s, i))
|
||||||
basis += [superelliptic_cech(self, superelliptic_form(self, Fxy(psi/y^j)), superelliptic_function(self, Fxy(m*y^(m-j)/x^i)))]
|
basis[index+genus] = 1/constant*superelliptic_cech(self, superelliptic_form(self, Fxy(psi/y^j)), superelliptic_function(self, Fxy(m*y^(m-j)/x^i)))
|
||||||
degrees0[t] = (psi.degree(), j)
|
degrees0[t] = (psi.degree(), j)
|
||||||
degrees1[t] = (-i, m-j)
|
degrees1[t] = (-i, m-j)
|
||||||
t += 1
|
t += 1
|
||||||
@ -216,14 +226,20 @@ class superelliptic:
|
|||||||
r = f.degree()
|
r = f.degree()
|
||||||
F = self.base_ring
|
F = self.base_ring
|
||||||
delta = self.nb_of_pts_at_infty
|
delta = self.nb_of_pts_at_infty
|
||||||
|
g = self.genus()
|
||||||
Rx.<x> = PolynomialRing(F)
|
Rx.<x> = PolynomialRing(F)
|
||||||
Rxy.<x, y> = PolynomialRing(F, 2)
|
Rxy.<x, y> = PolynomialRing(F, 2)
|
||||||
Fxy = FractionField(Rxy)
|
Fxy = FractionField(Rxy)
|
||||||
basis = []
|
basis = g*[0]
|
||||||
|
degrees = self.degrees_holomorphic_differentials()
|
||||||
|
degrees_inv = {b:a for a, b in degrees.items()}
|
||||||
for j in range(1, m):
|
for j in range(1, m):
|
||||||
for i in range(1, r):
|
for i in range(1, r):
|
||||||
if (r*(m-j) - m*i >= delta):
|
if (r*(m-j) - m*i >= delta):
|
||||||
basis += [superelliptic_function(self, Fxy(m*y^(m-j)/x^i))]
|
index = degrees_inv[(i-1, m-j)]
|
||||||
|
fct = superelliptic_function(self, Fxy(m*y^(m-j)/x^i))
|
||||||
|
constant = self.holomorphic_differentials_basis()[index].serre_duality_pairing(fct)
|
||||||
|
basis[index] = 1/constant*fct
|
||||||
return basis
|
return basis
|
||||||
|
|
||||||
def uniformizer(self):
|
def uniformizer(self):
|
||||||
|
Loading…
Reference in New Issue
Block a user