cohomology of structure sheaf

This commit is contained in:
jgarnek 2022-12-19 13:37:14 +00:00
parent 6edd5f9c40
commit c28c4a4fa4
17 changed files with 16957 additions and 24462 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -17,40 +17,3 @@ def magmathis(A, B, text = False):
if text:
return result
print(magma_free(result))
def as_reduction(AS, fct):
n = AS.height
F = AS.base_ring
variable_names = 'x, y'
for i in range(n):
variable_names += ', z' + str(i)
Rxyz = PolynomialRing(F, n+2, variable_names)
x, y = Rxyz.gens()[:2]
z = Rxyz.gens()[2:]
RxyzQ = FractionField(Rxyz)
ff = AS.functions
ff = [RxyzQ(F.function) for F in ff]
fct = RxyzQ(fct)
fct1 = numerator(fct)
fct2 = denominator(fct)
if fct2 != 1:
return as_reduction(AS, fct1)/as_reduction(AS, fct2)
result = RxyzQ(0)
change = 0
for a in fct1.monomials():
degrees_zi = [a.degree(z[i]) for i in range(n)]
d_div = [a.degree(z[i])//p for i in range(n)]
if d_div != n*[0]:
change = 1
d_rem = [a.degree(z[i])%p for i in range(n)]
monomial = fct1.coefficient(a)*x^(a.degree(x))*y^(a.degree(y))*prod(z[i]^(d_rem[i]) for i in range(n))*prod((z[i] + ff[i])^(d_div[i]) for i in range(n))
result += RxyzQ(fct1.coefficient(a)*x^(a.degree(x))*y^(a.degree(y))*prod(z[i]^(d_rem[i]) for i in range(n))*prod((z[i] + ff[i])^(d_div[i]) for i in range(n)))
if change == 0:
return RxyzQ(result)
else:
print(fct, '\n')
return as_reduction(AS, RxyzQ(result))

View File

@ -58,6 +58,16 @@ class as_cover:
self.y = all_y_series
self.z = all_z_series
self.dx = all_dx_series
##############
#Function field
variable_names = 'x, y'
for i in range(n):
variable_names += ', z' + str(i)
Rxyz = PolynomialRing(F, n+2, variable_names)
x, y = Rxyz.gens()[:2]
z = Rxyz.gens()[2:]
RxyzQ = FractionField(Rxyz)
self.fct_field = (RxyzQ, Rxyz, x, y, z)
def __repr__(self):
n = self.height
@ -106,17 +116,10 @@ class as_cover:
F = self.base_ring
m = C.exponent
r = C.polynomial.degree()
variable_names = 'x, y'
for i in range(n):
variable_names += ', z' + str(i)
Rxyz = PolynomialRing(F, n+2, variable_names)
x, y = Rxyz.gens()[:2]
z = Rxyz.gens()[2:]
RxyzQ = FractionField(Rxyz)
RxyzQ, Rxyz, x, y, z = self.fct_field
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):
@ -153,13 +156,7 @@ class as_cover:
F = self.base_ring
m = C.exponent
r = C.polynomial.degree()
variable_names = 'x, y'
for i in range(n):
variable_names += ', z' + str(i)
Rxyz = PolynomialRing(F, n+2, variable_names)
x, y = Rxyz.gens()[:2]
z = Rxyz.gens()[2:]
RxyzQ = FractionField(Rxyz)
RxyzQ, Rxyz, x, y, z = self.fct_field
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 = []
@ -211,13 +208,7 @@ class as_cover:
F = self.base_ring
m = C.exponent
r = C.polynomial.degree()
variable_names = 'x, y'
for i in range(n):
variable_names += ', z' + str(i)
Rxyz = PolynomialRing(F, n+2, variable_names)
x, y = Rxyz.gens()[:2]
z = Rxyz.gens()[2:]
RxyzQ = FractionField(Rxyz)
RxyzQ, Rxyz, x, y, z = self.fct_field
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 = []
@ -242,12 +233,8 @@ class as_cover:
'''Return uniformizer of curve self at i-th place at infinity.'''
p = self.characteristic
n = self.height
variable_names = 'x, y'
for j in range(n):
variable_names += ', z' + str(j)
Rxyz = PolynomialRing(F, n+2, variable_names)
x, y = Rxyz.gens()[:2]
z = Rxyz.gens()[2:]
F = self.base_ring
RxyzQ, Rxyz, x, y, z = self.fct_field
fx = as_function(self, x)
z = [as_function(self, zi) for zi in z]
# We create a list of functions. We add there all variables...
@ -262,14 +249,14 @@ class as_cover:
a = gcd(vz[j1] , vz[j2])
vz1 = vz[j1]/a
vz2 = vz[j2]/a
for b in GF(p):
for b in F:
if (z[j1]^(vz2) - b*z[j2]^(vz1)).valuation(i) > (z[j2]^(vz1)).valuation(i):
list_of_fcts += [z[j1]^(vz2) - b*z[j2]^(vz1)]
for j1 in range(n):
a = gcd(vz[j1], vfx)
vzj = vz[j1] /a
vfx = vfx/a
for b in GF(p):
for b in F:
if (fx^(vzj) - b*z[j1]^(vfx)).valuation(i) > (z[j1]^(vfx)).valuation(i):
list_of_fcts += [fx^(vzj) - b*z[j1]^(vfx)]
#Finally, we check if on the list there are two elements with the same valuation.
@ -307,6 +294,42 @@ class as_cover:
i+=1
return ramification_jps
def cohomology_of_structure_sheaf_basis(self, threshold = 8):
holo_diffs = self.holomorphic_differentials_basis(threshold = threshold)
from itertools import product
x_series = self.x
y_series = self.y
z_series = self.z
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
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
result_fcts = []
V = VectorSpace(F,self.genus())
S = V.subspace([])
RQxyz = FractionField(Rxyz)
pr = [list(GF(p)) for _ in range(n)]
i = 0
while len(result_fcts) < self.genus():
for j in range(0, m):
for k in product(*pr):
f = as_function(self, prod(z[i1]^(k[i1]) for i1 in range(n))/x^i*y^j)
f_products = []
for omega in holo_diffs:
f_products += [sum((f*omega).residue(place = _) for _ in range(self.nb_of_pts_at_infty))]
if vector(f_products) not in S:
S = S+V.subspace([V(f_products)])
result_fcts += [f]
i += 1
return result_fcts
def holomorphic_combinations(S):
"""Given a list S of pairs (form, corresponding Laurent series at some pt), find their combinations holomorphic at that pt."""
C_AS = S[0][0].curve

View File

@ -85,31 +85,6 @@ class as_form:
return linear_representation(Rxyz(self.form), holo)
def trace(self):
C = self.curve
C_super = C.quotient
n = C.height
F = C.base_ring
variable_names = 'x, y'
for j in range(n):
variable_names += ', z' + str(j)
Rxyz = PolynomialRing(F, n+2, variable_names)
x, y = Rxyz.gens()[:2]
z = Rxyz.gens()[2:]
RxyzQ = FractionField(Rxyz)
g = self.form
result = RxyzQ(0)
g_num = Rxyz(numerator(g))
g_den = Rxyz(denominator(g))
z = prod(z[i] for i in range(n))^(p-1)
for a in g_num.monomials():
if (z.divides(a)):
result += g_num.monomial_coefficient(a)*a/z
result /= g_den
Rxy.<x, y> = PolynomialRing(F, 2)
return superelliptic_form(C_super, Rxy(result))
def trace2(self):
C = self.curve
C_super = C.quotient
n = C.height
@ -128,9 +103,11 @@ class as_form:
result = result.form
Rxy.<x, y> = PolynomialRing(F, 2)
Qxy = FractionField(Rxy)
result = as_reduction(AS, result)
return superelliptic_form(C_super, Qxy(result))
def residue(self, place=0):
return self.expansion_at_infty(i = place).residue()
def artin_schreier_transform(power_series, prec = 10):
"""Given a power_series, find correction such that power_series - (correction)^p +correction has valuation

View File

@ -34,10 +34,16 @@ class as_function:
return as_function(C, constant*g)
def __mul__(self, other):
C = self.curve
g1 = self.function
g2 = other.function
return as_function(C, g1*g2)
if isinstance(other, as_function):
C = self.curve
g1 = self.function
g2 = other.function
return as_function(C, g1*g2)
if isinstance(other, as_form):
C = self.curve
g1 = self.function
g2 = other.form
return as_form(C, g1*g2)
def __truediv__(self, other):
C = self.curve
@ -88,33 +94,6 @@ class as_function:
return as_function(C, g.substitute(sub_list))
def trace(self):
C = self.curve
C_super = C.quotient
n = C.height
F = C.base_ring
variable_names = 'x, y'
for j in range(n):
variable_names += ', z' + str(j)
Rxyz = PolynomialRing(F, n+2, variable_names)
x, y = Rxyz.gens()[:2]
z = Rxyz.gens()[2:]
RxyzQ = FractionField(Rxyz)
g = self.function
g = as_reduction(C, g)
result = RxyzQ(0)
g_num = Rxyz(numerator(g))
g_den = Rxyz(denominator(g))
z = prod(z[i] for i in range(n))^(p-1)
for a in g_num.monomials():
if (z.divides(a)):
result += g_num.monomial_coefficient(a)*a/z
result /= g_den
result = as_reduction(C, result)
Rxy.<x, y> = PolynomialRing(F, 2)
Qxy = FractionField(Rxy)
return superelliptic_function(C_super, Qxy(result))
def trace2(self):
C = self.curve
C_super = C.quotient
n = C.height
@ -133,9 +112,32 @@ class as_function:
result = result.function
Rxy.<x, y> = PolynomialRing(F, 2)
Qxy = FractionField(Rxy)
result = as_reduction(AS, result)
return superelliptic_function(C_super, Qxy(result))
def diffn(self):
C = self.curve
C_super = C.quotient
n = C.height
RxyzQ, Rxyz, x, y, z = C.fct_field
fcts = C.functions
f = self.function
y_super = superelliptic_function(C_super, y)
dy_super = y_super.diffn().form
dz = []
for i in range(n):
dfct = fcts[i].diffn().form
dz += [-dfct]
result = f.derivative(x)
result += f.derivative(y)*dy_super
for i in range(n):
result += f.derivative(z[i])*dz[i]
return as_form(C, result)
def valuation(self, i = 0):
'''Return valuation at i-th place at infinity.'''
return self.expansion_at_infty(i).valuation()
C = self.curve
F = C.base_ring
Rt.<t> = LaurentSeriesRing(F)
return Rt(self.expansion_at_infty(i)).valuation()

View File

@ -6,9 +6,9 @@ def combination_components(omega, zmag, w):
group_elts = [(j1, j2) for j1 in range(p) for j2 in range(p)]
zvee = dual_elt(AS, zmag)
result = as_form(AS, 0)
for i in range(p^2):
omegai = ith_magical_component(omega, zvee, i)
aux_fct1 = w.group_action(group_elts[i]).function
aux_fct2 = omegai.form
for g in AS.group:
omegag = ith_magical_component(omega, zvee, g)
aux_fct1 = w.group_action(g).function
aux_fct2 = omegag.form
result += as_form(AS, aux_fct1*aux_fct2)
return result

View File

@ -13,12 +13,14 @@ def dual_elt(AS, zmag):
M = matrix(RxyzQ, p^n, p^n)
for i in range(p^n):
for j in range(p^n):
M[i, j] = (zmag.group_action(G[i])*zmag.group_action(G[j])).trace2()
elt = (zmag.group_action(G[i])*zmag.group_action(G[j])).trace().function
elt = Rxyz(elt.numerator())/Rxyz(elt.denominator())
M[i, j] = RxyzQ(elt)
main_det = M.determinant()
zvee = as_function(AS, 0)
for i in range(p^n):
Mprim = matrix(RxyzQ, M)
Mprim[:, i] = vector([(j == 0) for j in range(p^n)])
fi = Mprim.determinant()/main_det
zvee += fi*zmag.group_action(G[i])
zvee += as_function(AS, fi*(zmag.group_action(G[i]).function))
return zvee

View File

@ -1,8 +1,6 @@
def ith_magical_component(omega, zvee, g):
'''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.'''
AS = omega.curve
p = AS.characteristic
z_vee_fct = zvee.group_action(g).function
new_form = as_form(AS, z_vee_fct*omega.form)
return new_form.trace2()
z_vee_g = zvee.group_action(g)
new_form = z_vee_g*omega
return new_form.trace()

View File

@ -0,0 +1,15 @@
p = 3
m = 1
F = GF(p)
Rx.<x> = PolynomialRing(F)
f = x^2 + 1
C_super = superelliptic(f, m)
Rxy.<x, y> = PolynomialRing(F, 2)
f1 = superelliptic_function(C_super, x^2)
f2 = superelliptic_function(C_super, x^4)
AS = as_cover(C_super, [f1, f2], prec=1000)
RxyzQ, Rxyz, x, y, z = AS.fct_field
f_z = as_function(AS, z[0]*z[1]*y)
df_z = f_z.diffn()
print(df_z.form == -z[0]*z[1]*x + y*z[1]*x - y*z[0]*x^3)

View File

@ -15,6 +15,6 @@ zdual = dual_elt(AS, zmag)
for i in range(p):
for j in range(p):
if (i, j) == (0, 0):
print((zmag*(zdual.group_action([i, j]))).trace2().function == 1)
print((zmag*(zdual.group_action([i, j]))).trace().function == 1)
else:
print((zmag*(zdual.group_action([i, j]))).trace2().function == 0)
print((zmag*(zdual.group_action([i, j]))).trace().function == 0)

View File

@ -1,4 +1,4 @@
p = 3
p = 5
m = 1
F = GF(p)
Rx.<x> = PolynomialRing(F)
@ -6,51 +6,14 @@ f = x
C_super = superelliptic(f, m)
Rxy.<x, y> = PolynomialRing(F, 2)
f1 = superelliptic_function(C_super, x^2)
f2 = superelliptic_function(C_super, x^4)
f3 = superelliptic_function(C_super, x^5)
AS = as_cover(C_super, [f1, f2, f3], prec=1000)
print(AS)
zmag = AS.magical_element(threshold = 20)[0]
zvee = dual_elt(AS, zmag)
### DEFINE THE POLYNOMIALS
n = AS.height
variable_names = 'x, y'
for i in range(n):
variable_names += ', z' + str(i)
Rxyz = PolynomialRing(F, n+2, variable_names)
x, y = Rxyz.gens()[:2]
z = Rxyz.gens()[2:]
###############
def val_of_components(omega, zvee):
result = []
AS = omega.curve
for i in range(p^2):
omega_i = ith_magical_component(omega, zvee, i)
val = omega_i.expansion_at_infty().valuation()
val = val*p^2 + AS.exponent_of_different()
result += [val]
return result
#############
G = AS.group
g = AS.genus()
print(AS.exponent_of_different_prim())
v_x = as_function(AS, x).expansion_at_infty().valuation()
n = AS.height
v_z = [as_function(AS, z[i]).expansion_at_infty().valuation() for i in range(n)]
omega = AS.holomorphic_differentials_basis()[-16]
from itertools import product
pr = [list(range(p)) for _ in range(n)]
for i in range(0, 30):
for k in product(*pr):
v_w = i*v_x+ sum(k[i]*v_z[i] for i in range(n))
if (v_w < - AS.exponent_of_different_prim() + 10 and v_w > - AS.exponent_of_different_prim()):
w = as_function(AS, x^i * prod(z[i1]^(k[i1]) for i1 in range(n)))
result = as_form(AS, 0)
for g in G:
component = ith_magical_component(omega, zvee, g).form
result += as_form(AS, w.group_action(g).function*component)
print(result.expansion_at_infty().valuation(), w.expansion_at_infty().valuation() - zmag.expansion_at_infty().valuation())
for a in range(3, 13):
for b in range(3, 13):
if a %p != 0 and b%p != 0 and a !=b:
try:
f1 = superelliptic_function(C_super, x^a+x)
f2 = superelliptic_function(C_super, x^b)
AS = as_cover(C_super, [f1, f2], prec=1000)
#print(AS.at_most_poles(AS.exponent_of_different_prim()))
print(AS.magical_element(threshold = 20))
except:
pass

View File

@ -1,43 +1,14 @@
p = 3
m = 1
F = GF(p)
F = GF(p^2, 'a')
a = F.gens()[0]
Rx.<x> = PolynomialRing(F)
f = x
C_super = superelliptic(f, m)
Rxy.<x, y> = PolynomialRing(F, 2)
f1 = superelliptic_function(C_super, x^7)
f2 = superelliptic_function(C_super, x^4)
f2 = superelliptic_function(C_super, a*x^7)
AS = as_cover(C_super, [f1, f2], prec=1000)
print(AS.uniformizer())
def rep_jumps(AS, threshold = 30):
ile = 1
i = 1
result = []
flag = 0
while(flag == 0):
if len(AS.at_most_poles(i, threshold = threshold)) > ile:
ile = len(AS.at_most_poles(i, threshold = threshold))
result += [i]
if i%p != 0:
flag = 1
i+=1
return result
#print(rep_jumps(AS, threshold = 30))
def uniformizer(AS, threshold = 30):
p = AS.characteristic
n = AS.height
variable_names = 'x, y'
for i in range(n):
variable_names += ', z' + str(i)
Rxyz = PolynomialRing(F, n+2, variable_names)
x, y = Rxyz.gens()[:2]
z = Rxyz.gens()[2:]
zmag = AS.magical_element()[0]
v_x = as_function(AS, x).expansion_at_infty().valuation()
dprim = AS.exponent_of_different_prim()
d, a, b = xgcd(v_x, -dprim)
return as_function(AS, x^a*zmag.function^b)
#print(AS.uniformizer())
print(AS.ramification_jumps())

View File

@ -1,7 +1,23 @@
Rx.<x> = PolynomialRing(GF(5))
C = superelliptic(x^3 + 1, 2)
Rxy.<x, y> = PolynomialRing(GF(5), 2)
f1 = superelliptic_function(C, x*y)
CAS = as_cover(C, [f1])
g = CAS.uniformizer()
AA = g
p = 3
m = 1
F = GF(p)
Rx.<x> = PolynomialRing(F)
f = x
C_super = superelliptic(f, m)
Rxy.<x, y> = PolynomialRing(F, 2)
f1 = superelliptic_function(C_super, x^7)
f2 = superelliptic_function(C_super, x^4)
AS = as_cover(C_super, [f1, f2], prec=1000)
AS1 = as_cover(C_super, [f1], prec=1000)
#print(AS.ramification_jumps())
#print(pole_numbers(AS))
RxyzQ, Rxyz, x, y, z = AS.fct_field
zmag = (AS.magical_element())[0]
zvee = dual_elt(AS, zmag)
t = AS.uniformizer()
omega1 = AS1.holomorphic_differentials_basis()[4]
omega2 = as_form(AS, t.function*RxyzQ(omega1.form))
for g in AS.group:
print(ith_magical_component(omega2, zvee, g).expansion_at_infty().valuation(), AS.jumps[0][1])

View File

@ -5,6 +5,7 @@ load('superelliptic/superelliptic_cech_class.sage')
load('as_covers/as_cover_class.sage')
load('as_covers/as_function_class.sage')
load('as_covers/as_form_class.sage')
load('as_covers/as_reduction.sage')
load('as_covers/as_auxilliary.sage')
load('as_covers/dual_element.sage')
load('as_covers/ith_magical_component.sage')
@ -14,5 +15,6 @@ load('auxilliaries/reverse.sage')
load('auxilliaries/hensel.sage')
##############
##############
load('drafty/draft2.sage')
#load('drafty/draft3.sage')
load('drafty/draft.sage')
load('drafty/pole_numbers.sage')
#load('drafty/draft4.sage')

View File

@ -4,11 +4,13 @@
#load('as_covers/tests/group_action_matrices_test.sage')
#print("dual_element_test:")
#load('as_covers/tests/dual_element_test.sage')
#print("ith_component_test:")
#load('as_covers/tests/ith_component_test.sage')
print("ith_component_test:")
load('as_covers/tests/ith_component_test.sage')
#print("ith ramification group test:")
#load('as_covers/tests/ith_ramification_gp_test.sage')
#print("uniformizer test:")
#load('as_covers/tests/uniformizer_test.sage')
print("ramification jumps test:")
load('as_covers/tests/ramification_jumps_test.sage')
#print("ramification jumps test:")
#load('as_covers/tests/ramification_jumps_test.sage')
print("diffn_test:")
load('as_covers/tests/diffn_test.sage')

View File

@ -726,9 +726,6 @@
"outputs": [
],
"source": [
"Rx.<x> = PolynomialRing(GF(5))\n",
"f = x^7 + x + 1\n",
"C = superelliptic(f, 2)"
]
},
{
@ -740,7 +737,6 @@
"outputs": [
],
"source": [
"omega = C.de_rham_basis()[3]"
]
},
{