baza crys dziala; poprawki w coordinates dr; wspolrzednie cris prawie dzialaja
This commit is contained in:
parent
ce0ac0dcec
commit
42ccc4d3e9
16036
sage/.run.term-0.term
16036
sage/.run.term-0.term
File diff suppressed because one or more lines are too long
11
sage/as_covers/tests/cartier_test.sage
Normal file
11
sage/as_covers/tests/cartier_test.sage
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
p = 5
|
||||||
|
m = 2
|
||||||
|
F = GF(p)
|
||||||
|
Rx.<x> = PolynomialRing(F)
|
||||||
|
f = x^3 + x + 1
|
||||||
|
C = superelliptic(f, m)
|
||||||
|
g = f(x^p - x)
|
||||||
|
C1 = superelliptic(g, m)
|
||||||
|
ff = superelliptic_function(C, x)
|
||||||
|
AS = as_cover(C, [ff])
|
||||||
|
print(C1.cartier_matrix().rank() == AS.cartier_matrix().rank())
|
@ -15,8 +15,14 @@ C = superelliptic(f, m)
|
|||||||
#b = C.crystalline_cohomology_basis()
|
#b = C.crystalline_cohomology_basis()
|
||||||
#print(autom(b[0]).coordinates(basis = b))
|
#print(autom(b[0]).coordinates(basis = b))
|
||||||
#eta1 = (dy + dV(2xy) + V(x^5 \, dy), V(y/x))
|
#eta1 = (dy + dV(2xy) + V(x^5 \, dy), V(y/x))
|
||||||
eta1 = superelliptic_drw_cech(C.y.teichmuller().diffn() + (2*C.x*C.y).verschiebung().diffn() + (C.x^5*C.y.diffn()).verschiebung(), (C.y/C.x).verschiebung())
|
#eta1 = superelliptic_drw_cech(C.y.teichmuller().diffn() + (2*C.x*C.y).verschiebung().diffn() + (C.x^5*C.y.diffn()).verschiebung(), (C.y/C.x).verschiebung())
|
||||||
#eta2 = ( x \, dy + 3 x^3 \, dy + dV((2x^4 + 2x^2 + 2) y) + V( (x^4 + x^2 + 1) dy), -[y/x])
|
#eta2 = ( x \, dy + 3 x^3 \, dy + dV((2x^4 + 2x^2 + 2) y) + V( (x^4 + x^2 + 1) dy), -[y/x])
|
||||||
eta2 = superelliptic_drw_cech(C.x.teichmuller()*(C.y.teichmuller()).diffn() + ((2*C.x^4 + 2*C.x^2 + 2*C.one) * C.y).verschiebung().diffn(), - (C.y/C.x).teichmuller())
|
#eta2 = superelliptic_drw_cech(C.x.teichmuller()*(C.y.teichmuller()).diffn() + ((2*C.x^4 + 2*C.x^2 + 2*C.one) * C.y).verschiebung().diffn(), - (C.y/C.x).teichmuller())
|
||||||
aux = de_rham_witt_lift(C.de_rham_basis()[1])
|
#omega8_lift0, compare = de_rham_witt_lift(C.de_rham_basis()[1])
|
||||||
print(aux)
|
#omega8_lift = -(C.x^(-3)).teichmuller()*C.y.teichmuller().diffn() + 2*C.y.teichmuller()*(C.x^(-4)).teichmuller()*C.x.teichmuller().diffn()
|
||||||
|
#eta2 = de_rham_witt_lift(C.de_rham_basis()[1])
|
||||||
|
#b = autom(eta2)
|
||||||
|
#print(autom(C.crystalline_cohomology_basis()[1]).coordinates())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@ load('superelliptic_drw/decomposition_into_g0_g8.sage')
|
|||||||
load('superelliptic_drw/superelliptic_witt.sage')
|
load('superelliptic_drw/superelliptic_witt.sage')
|
||||||
load('superelliptic_drw/superelliptic_drw_form.sage')
|
load('superelliptic_drw/superelliptic_drw_form.sage')
|
||||||
load('superelliptic_drw/superelliptic_drw_cech.sage')
|
load('superelliptic_drw/superelliptic_drw_cech.sage')
|
||||||
|
load('superelliptic_drw/regular_form.sage')
|
||||||
load('superelliptic_drw/de_rham_witt_lift.sage')
|
load('superelliptic_drw/de_rham_witt_lift.sage')
|
||||||
load('superelliptic_drw/automorphism.sage')
|
load('superelliptic_drw/automorphism.sage')
|
||||||
load('auxilliaries/reverse.sage')
|
load('auxilliaries/reverse.sage')
|
||||||
@ -26,8 +27,6 @@ load('auxilliaries/linear_combination_polynomials.sage')
|
|||||||
##############
|
##############
|
||||||
##############
|
##############
|
||||||
load('drafty/convert_superelliptic_into_AS.sage')
|
load('drafty/convert_superelliptic_into_AS.sage')
|
||||||
load('drafty/regular_on_U0.sage')
|
|
||||||
load('drafty/lift_to_de_rham.sage')
|
|
||||||
load('drafty/draft.sage')
|
load('drafty/draft.sage')
|
||||||
#load('drafty/draft_klein_covers.sage')
|
#load('drafty/draft_klein_covers.sage')
|
||||||
#load('drafty/2gpcovers.sage')
|
#load('drafty/2gpcovers.sage')
|
||||||
|
@ -46,52 +46,30 @@ class superelliptic_cech:
|
|||||||
Fx = FractionField(Rx)
|
Fx = FractionField(Rx)
|
||||||
FxRy.<y> = PolynomialRing(Fx)
|
FxRy.<y> = PolynomialRing(Fx)
|
||||||
g = C.genus()
|
g = C.genus()
|
||||||
degrees_holo = C.degrees_holomorphic_differentials()
|
|
||||||
degrees_holo_inv = {b:a for a, b in degrees_holo.items()}
|
|
||||||
degrees0 = C.degrees_de_rham0()
|
|
||||||
degrees0_inv = {b:a for a, b in degrees0.items()}
|
|
||||||
degrees1 = C.degrees_de_rham1()
|
|
||||||
degrees1_inv = {b:a for a, b in degrees1.items()}
|
|
||||||
basis = C.de_rham_basis()
|
basis = C.de_rham_basis()
|
||||||
|
|
||||||
omega = self.omega0
|
omega = self.omega0
|
||||||
fct = self.f
|
fct = self.f
|
||||||
|
|
||||||
|
if fct.function == Rx(0) and omega.form == Rx(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):
|
||||||
for j in range(1, m):
|
result = list(omega.coordinates()) + g*[0]
|
||||||
omega_j = Fx(omega.jth_component(j))
|
result = vector([F(a) for a in result])
|
||||||
if omega_j != Fx(0):
|
return result
|
||||||
d = degree_of_rational_fctn(omega_j, F)
|
|
||||||
index = degrees_holo_inv[(d, j)]
|
coord = fct.coordinates()
|
||||||
a = coeff_of_rational_fctn(omega_j, F)
|
coord = g*[0] + list(coord)
|
||||||
a1 = coeff_of_rational_fctn(basis[index].omega0.jth_component(j), F)
|
coord = vector([F(a) for a in coord])
|
||||||
elt = self - (a/a1)*basis[index]
|
aux = self
|
||||||
return elt.coordinates() + a/a1*vector([F(i == index) for i in range(0, 2*g)])
|
for i in range(g, 2*g):
|
||||||
|
aux -= coord[i]*basis[i]
|
||||||
for j in range(1, m):
|
aux_f = decomposition_g0_g8(aux.f)[0]
|
||||||
fct_j = Fx(fct.jth_component(j))
|
aux.omega0 -= aux_f.diffn()
|
||||||
if (fct_j != Rx(0)):
|
aux.f = 0*C.x
|
||||||
d = degree_of_rational_fctn(fct_j, F)
|
aux.omega8 = aux.omega0
|
||||||
|
return coord + aux.coordinates()
|
||||||
if (d, j) in degrees1.values():
|
|
||||||
index = degrees1_inv[(d, j)]
|
|
||||||
a = coeff_of_rational_fctn(fct_j, F)
|
|
||||||
elt = self - (a/m)*basis[index]
|
|
||||||
return elt.coordinates() + a/m*vector([F(i == index) for i in range(0, 2*g)])
|
|
||||||
|
|
||||||
if d<0:
|
|
||||||
a = coeff_of_rational_fctn(fct_j, F)
|
|
||||||
h = superelliptic_function(C, FxRy(a*y^j*x^d))
|
|
||||||
elt = superelliptic_cech(C, self.omega0, self.f - h)
|
|
||||||
return elt.coordinates()
|
|
||||||
|
|
||||||
if (fct_j != Rx(0)):
|
|
||||||
G = superelliptic_function(C, y^j*x^d)
|
|
||||||
a = coeff_of_rational_fctn(fct_j, F)
|
|
||||||
elt =self - a*superelliptic_cech(C, diffn(G), G)
|
|
||||||
return elt.coordinates()
|
|
||||||
|
|
||||||
return vector(2*g*[0])
|
|
||||||
|
|
||||||
def is_cocycle(self):
|
def is_cocycle(self):
|
||||||
w0 = self.omega0
|
w0 = self.omega0
|
||||||
|
@ -196,9 +196,9 @@ class superelliptic:
|
|||||||
Fxy = FractionField(Rxy)
|
Fxy = FractionField(Rxy)
|
||||||
basis = []
|
basis = []
|
||||||
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*j - m*i >= delta):
|
if (r*(m-j) - m*i >= delta):
|
||||||
basis += [superelliptic_function(self, Fxy(m*y^(j)/x^i))]
|
basis += [superelliptic_function(self, Fxy(m*y^(m-j)/x^i))]
|
||||||
return basis
|
return basis
|
||||||
|
|
||||||
#Auxilliary. Given a superelliptic curve C : y^m = f(x) and a polynomial g(x, y)
|
#Auxilliary. Given a superelliptic curve C : y^m = f(x) and a polynomial g(x, y)
|
||||||
|
@ -6,7 +6,12 @@ class superelliptic_form:
|
|||||||
g = Fxy(reduction_form(C, g))
|
g = Fxy(reduction_form(C, g))
|
||||||
self.form = g
|
self.form = g
|
||||||
self.curve = C
|
self.curve = C
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
if self.reduce().form == other.reduce().form:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
def __add__(self, other):
|
def __add__(self, other):
|
||||||
C = self.curve
|
C = self.curve
|
||||||
g1 = self.form
|
g1 = self.form
|
||||||
@ -37,9 +42,6 @@ class superelliptic_form:
|
|||||||
omega = self.form
|
omega = self.form
|
||||||
return superelliptic_form(C, constant*omega)
|
return superelliptic_form(C, constant*omega)
|
||||||
|
|
||||||
def __eq__(self, other):
|
|
||||||
return self.form == other.form
|
|
||||||
|
|
||||||
def cartier(self):
|
def cartier(self):
|
||||||
'''Computes Cartier operator on the form. Idea: y^m = f(x) -> y^(p^r - 1) = f(x)^M, where r = ord_p(m),
|
'''Computes Cartier operator on the form. Idea: y^m = f(x) -> y^(p^r - 1) = f(x)^M, where r = ord_p(m),
|
||||||
M = (p^r - 1)/m. Thus h(x)/y^j dx = h(x) f(x)^(M*j)/y^(p^r * j) dx. Thus C(h(x)/y^j dx) = 1/y^(p^(r-1)*j) C(h(x) f(x)^(M*j) dx).'''
|
M = (p^r - 1)/m. Thus h(x)/y^j dx = h(x) f(x)^(M*j)/y^(p^r * j) dx. Thus C(h(x)/y^j dx) = 1/y^(p^(r-1)*j) C(h(x) f(x)^(M*j) dx).'''
|
||||||
@ -52,7 +54,7 @@ class superelliptic_form:
|
|||||||
Fx = FractionField(Rx)
|
Fx = FractionField(Rx)
|
||||||
FxRy.<y> = PolynomialRing(Fx)
|
FxRy.<y> = PolynomialRing(Fx)
|
||||||
Fxy = FractionField(FxRy)
|
Fxy = FractionField(FxRy)
|
||||||
result = superelliptic_form(C, FxRy(0))
|
result = 0*C.dx
|
||||||
mult_order = Integers(m)(p).multiplicative_order()
|
mult_order = Integers(m)(p).multiplicative_order()
|
||||||
M = Integer((p^(mult_order)-1)/m)
|
M = Integer((p^(mult_order)-1)/m)
|
||||||
|
|
||||||
@ -111,8 +113,8 @@ class superelliptic_form:
|
|||||||
Rx.<x> = PolynomialRing(F)
|
Rx.<x> = PolynomialRing(F)
|
||||||
for j in range(0, m):
|
for j in range(0, m):
|
||||||
if self.jth_component(j) not in Rx:
|
if self.jth_component(j) not in Rx:
|
||||||
return 0
|
return False
|
||||||
return 1
|
return True
|
||||||
|
|
||||||
def is_regular_on_Uinfty(self):
|
def is_regular_on_Uinfty(self):
|
||||||
C = self.curve
|
C = self.curve
|
||||||
@ -128,8 +130,8 @@ class superelliptic_form:
|
|||||||
A = self.jth_component(j)
|
A = self.jth_component(j)
|
||||||
d = degree_of_rational_fctn(A, F)
|
d = degree_of_rational_fctn(A, F)
|
||||||
if(-d*M + j*R -(M+1)<0):
|
if(-d*M + j*R -(M+1)<0):
|
||||||
return 0
|
return False
|
||||||
return 1
|
return True
|
||||||
|
|
||||||
def expansion_at_infty(self, place = 0, prec=10):
|
def expansion_at_infty(self, place = 0, prec=10):
|
||||||
g = self.form
|
g = self.form
|
||||||
@ -166,4 +168,38 @@ class superelliptic_form:
|
|||||||
Rxy.<x, y> = PolynomialRing(F, 2)
|
Rxy.<x, y> = PolynomialRing(F, 2)
|
||||||
Fxy = FractionField(Rxy)
|
Fxy = FractionField(Rxy)
|
||||||
fct = reduction(C, Fxy(y^m*fct))
|
fct = reduction(C, Fxy(y^m*fct))
|
||||||
return superelliptic_form(C, fct/y^m)
|
return superelliptic_form(C, fct/y^m)
|
||||||
|
|
||||||
|
def int(self):
|
||||||
|
'''Computes an "integral" of a form dg. Idea: y^m = f(x) -> y^(p^r - 1) = f(x)^M, where r = ord_p(m),
|
||||||
|
M = (p^r - 1)/m. Thus h(x)/y^j dx = h(x) f(x)^(M*j)/y^(p^r * j) dx. Thus int(h(x)/y^j dx) = 1/y^(p^(r-1)*j) int(h(x) f(x)^(M*j) dx).'''
|
||||||
|
C = self.curve
|
||||||
|
m = C.exponent
|
||||||
|
p = C.characteristic
|
||||||
|
f = C.polynomial
|
||||||
|
F = C.base_ring
|
||||||
|
Rx.<x> = PolynomialRing(F)
|
||||||
|
Fx = FractionField(Rx)
|
||||||
|
FxRy.<y> = PolynomialRing(Fx)
|
||||||
|
Fxy = FractionField(FxRy)
|
||||||
|
result = 0*C.x
|
||||||
|
mult_order = Integers(m)(p).multiplicative_order()
|
||||||
|
M = Integer((p^(mult_order)-1)/m)
|
||||||
|
|
||||||
|
for j in range(0, m):
|
||||||
|
fct_j = self.jth_component(j)
|
||||||
|
h = Fx(fct_j*f^(M*j))
|
||||||
|
h_denom = h.denominator()
|
||||||
|
h *= (h_denom)^(p)
|
||||||
|
h = Rx(h)
|
||||||
|
j1 = (p^(mult_order)*j)%m
|
||||||
|
B = floor(p^(mult_order)*j/m)
|
||||||
|
result += superelliptic_function(C, h.integral()/(f^(B)*y^(j1)*h_denom^p))
|
||||||
|
return result
|
||||||
|
|
||||||
|
def inv_cartier(omega):
|
||||||
|
'''If omega is regular, return form eta such that Cartier(eta) = omega'''
|
||||||
|
omega_regular = omega.regular_form()
|
||||||
|
C = omega.curve
|
||||||
|
p = C.characteristic
|
||||||
|
return (omega_regular.dx)^p*C.x^(p-1)*C.dx + (omega_regular.dy)^p*C.y^(p-1)*C.y.diffn()
|
5
sage/superelliptic/tests/a_number_test.sage
Normal file
5
sage/superelliptic/tests/a_number_test.sage
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
F = GF(67)
|
||||||
|
P.<x>= PolynomialRing(F)
|
||||||
|
X = HyperellipticCurve(x^7 + x^3 + x)
|
||||||
|
C = superelliptic(x^7 + x^3 + x, 2)
|
||||||
|
print(X.a_number() == C.a_number())
|
12
sage/superelliptic/tests/form_coordinates_test.sage
Normal file
12
sage/superelliptic/tests/form_coordinates_test.sage
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
p = 7
|
||||||
|
m = 4
|
||||||
|
F = GF(p)
|
||||||
|
Rx.<x> = PolynomialRing(F)
|
||||||
|
f = x^5 + x
|
||||||
|
C = superelliptic(f, m)
|
||||||
|
bbb = C.holomorphic_differentials_basis()
|
||||||
|
v = [GF(p).random_element() for _ in range(C.genus())]
|
||||||
|
aaa = 0*C.dx
|
||||||
|
for i in range(C.genus()):
|
||||||
|
aaa += v[i]*bbb[i]
|
||||||
|
print(vector(aaa.coordinates()) == vector(v))
|
6
sage/superelliptic/tests/p_rank_test.sage
Normal file
6
sage/superelliptic/tests/p_rank_test.sage
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
print("Nie działa!")
|
||||||
|
F = GF(67)
|
||||||
|
P.<x>= PolynomialRing(F)
|
||||||
|
X = HyperellipticCurve(x^7 + x^3 + x)
|
||||||
|
C = superelliptic(x^7 + x^3 + x, 2)
|
||||||
|
print(X.p_rank() == C.p_rank())
|
11
sage/superelliptic/tests/pth_root_test.sage
Normal file
11
sage/superelliptic/tests/pth_root_test.sage
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
p = 3
|
||||||
|
m = 4
|
||||||
|
F = GF(p)
|
||||||
|
Rx.<x> = PolynomialRing(F)
|
||||||
|
f = x^5 + x
|
||||||
|
C = superelliptic(f, m)
|
||||||
|
g = (C.x)^5 * (C.y)^2 + 2*(C.x)^2 * (C.y)^3
|
||||||
|
g = g^p
|
||||||
|
print(g.pth_root()==(C.x)^5 * (C.y)^2 + 2*(C.x)^2 * (C.y)^3)
|
||||||
|
g = C.x
|
||||||
|
print(g.pth_root())
|
@ -11,6 +11,9 @@ def autom(self):
|
|||||||
if isinstance(self, superelliptic_form):
|
if isinstance(self, superelliptic_form):
|
||||||
result = superelliptic_form(C, Fxy(self.form).subs({x:x+1, y:y}))
|
result = superelliptic_form(C, Fxy(self.form).subs({x:x+1, y:y}))
|
||||||
return result
|
return result
|
||||||
|
if isinstance(self, superelliptic_cech):
|
||||||
|
result = superelliptic_cech(C, autom(self.omega0), autom(self.f))
|
||||||
|
return result
|
||||||
if isinstance(self, superelliptic_witt):
|
if isinstance(self, superelliptic_witt):
|
||||||
result = superelliptic_witt(autom(self.t), autom(self.f))
|
result = superelliptic_witt(autom(self.t), autom(self.f))
|
||||||
return result
|
return result
|
||||||
|
@ -1,31 +1,50 @@
|
|||||||
|
def de_rham_witt_lift_form0(omega):
|
||||||
|
C = omega.curve
|
||||||
|
omega_regular = omega.regular_form() #Present omega0 in the form P dx + Q dy
|
||||||
|
#Now the obvious lift of omega0 = P dx + Q dy to de Rham-Witt is [P] d[x] + [Q] d[y]
|
||||||
|
return omega_regular.dx.teichmuller()*(C.x.teichmuller().diffn()) + omega_regular.dy.teichmuller()*(C.y.teichmuller().diffn())
|
||||||
|
|
||||||
|
def de_rham_witt_lift_form8(omega):
|
||||||
|
C = omega.curve
|
||||||
|
g = C.genus()
|
||||||
|
omega_regular = second_patch(omega).regular_form()
|
||||||
|
omega_regular = (second_patch(omega_regular.dx), second_patch(omega_regular.dy))
|
||||||
|
u = (C.x)^(-1)
|
||||||
|
v = (C.y)/(C.x)^(g+1)
|
||||||
|
omega_lift = omega_regular[0].teichmuller()*(u.teichmuller().diffn()) + omega_regular[1].teichmuller()*(v.teichmuller().diffn())
|
||||||
|
return omega_lift
|
||||||
|
|
||||||
def de_rham_witt_lift(cech_class, prec = 50):
|
def de_rham_witt_lift(cech_class, prec = 50):
|
||||||
C = cech_class.curve
|
C = cech_class.curve
|
||||||
g = C.genus()
|
g = C.genus()
|
||||||
omega0 = cech_class.omega0
|
omega0 = cech_class.omega0
|
||||||
omega8 = cech_class.omega8
|
omega8 = cech_class.omega8
|
||||||
fct = cech_class.f
|
fct = cech_class.f
|
||||||
omega0_regular = regular_form(omega0) #Present omega0 in the form P dx + Q dy
|
omega0_lift = de_rham_witt_lift_form0(omega0)
|
||||||
print('omega0_regular', omega0_regular)
|
omega8_lift = de_rham_witt_lift_form8(omega8)
|
||||||
omega0_lift = omega0_regular[0].teichmuller()*(C.x.teichmuller().diffn()) + omega0_regular[1].teichmuller()*(C.y.teichmuller().diffn())
|
print('omega0_lift, omega8_lift', omega0_lift, omega8_lift)
|
||||||
#Now the obvious lift of omega0 = P dx + Q dy to de Rham-Witt is [P] d[x] + [Q] d[y]
|
|
||||||
print('omega8', omega8, 'second_patch(omega8)', second_patch(omega8))
|
|
||||||
omega8_regular = regular_form(second_patch(omega8)) # The same for omega8.
|
|
||||||
print('omega8_regular 1', omega8_regular)
|
|
||||||
omega8_regular = (second_patch(omega8_regular[0]), second_patch(omega8_regular[1]))
|
|
||||||
print('omega8_regular 2', omega8_regular)
|
|
||||||
u = (C.x)^(-1)
|
|
||||||
v = (C.y)/(C.x)^(g+1)
|
|
||||||
omega8_lift = omega8_regular[0].teichmuller()*(u.teichmuller().diffn()) + omega8_regular[1].teichmuller()*(v.teichmuller().diffn())
|
|
||||||
aux = omega0_lift - omega8_lift - fct.teichmuller().diffn() # now aux is of the form (V(smth) + dV(smth), V(smth))
|
aux = omega0_lift - omega8_lift - fct.teichmuller().diffn() # now aux is of the form (V(smth) + dV(smth), V(smth))
|
||||||
return aux
|
#return aux
|
||||||
if aux.h1.function != 0:
|
if aux.h1.function != 0:
|
||||||
raise ValueError('Something went wrong - aux is not of the form (V(smth) + dV(smth), V(smth)).')
|
raise ValueError('Something went wrong - aux is not of the form (V(smth) + dV(smth), V(smth)).')
|
||||||
decom_aux_h2 = decomposition_g0_g8(aux.h2, prec=prec) #decompose dV(smth) in aux as smth regular on U0 - smth regular on U8.
|
decom_aux_h2 = decomposition_g0_g8(aux.h2, prec=prec) #decompose dV(smth) in aux as smth regular on U0 - smth regular on U8.
|
||||||
aux_h2 = decom_aux_h2[0]
|
aux_h2 = decom_aux_h2[0]
|
||||||
aux_f = decom_aux_h2[2]
|
aux_f = decom_aux_h2[2]
|
||||||
aux_omega0 = decomposition_omega0_omega8(aux.omega, prec=prec)[0]
|
aux_omega0 = decomposition_omega0_omega8(aux.omega, prec=prec)[0]
|
||||||
result = superelliptic_drw_cech(omega0_lift - aux_h2.verschiebung().diffn() - aux_omega0.verschiebung(), fct.teichmuller() + aux_f.verschiebung())
|
result = superelliptic_drw_cech(omega0_lift - aux_omega0.verschiebung(), fct.teichmuller() + aux_h2.verschiebung() + aux_f.verschiebung())
|
||||||
return result.reduce()
|
compare = omega8_lift-decom_aux_h2[1].verschiebung().diffn() - decomposition_omega0_omega8(aux.omega, prec=prec)[1].verschiebung()
|
||||||
|
print("result.omega8 == compare", result.omega8 == compare)
|
||||||
|
print("result.omega8 - compare", result.omega8 - compare)
|
||||||
|
|
||||||
|
#print('test:', omega0_lift - omega8_lift - fct.teichmuller().diffn() == decom_aux_h2[0].verschiebung().diffn() - decom_aux_h2[1].verschiebung().diffn() + decomposition_omega0_omega8(aux.omega, prec=prec)[0].verschiebung() - decomposition_omega0_omega8(aux.omega, prec=prec)[1].verschiebung())
|
||||||
|
#print('test 1:', omega0_lift - decom_aux_h2[0].verschiebung().diffn() - decomposition_omega0_omega8(aux.omega, prec=prec)[0].verschiebung() - fct.teichmuller().diffn() == omega8_lift - decom_aux_h2[1].verschiebung().diffn() - decomposition_omega0_omega8(aux.omega, prec=prec)[1].verschiebung())
|
||||||
|
#A = omega0_lift - decomposition_omega0_omega8(aux.omega, prec=prec)[0].verschiebung()
|
||||||
|
#B = decom_aux_h2[0].verschiebung() + fct.teichmuller()
|
||||||
|
#C = omega8_lift - decom_aux_h2[1].verschiebung().diffn() - decomposition_omega0_omega8(aux.omega, prec=prec)[1].verschiebung()
|
||||||
|
#print('test 2:', A - B.diffn() == C)
|
||||||
|
#print('test 3:', result.omega0 == A, result.f == B, result.omega8 == C)
|
||||||
|
#print(result.omega8, '\n \n', compare, '\n \n', aux_f, '\n \n')
|
||||||
|
return result#.reduce()
|
||||||
|
|
||||||
def crystalline_cohomology_basis(self, prec = 50):
|
def crystalline_cohomology_basis(self, prec = 50):
|
||||||
result = []
|
result = []
|
||||||
|
@ -3,7 +3,7 @@ def decomposition_g0_g8(fct, prec = 50):
|
|||||||
and f is combination of basis of H^1(X, OX). Output is (g0, g8, f).'''
|
and f is combination of basis of H^1(X, OX). Output is (g0, g8, f).'''
|
||||||
C = fct.curve
|
C = fct.curve
|
||||||
g = C.genus()
|
g = C.genus()
|
||||||
coord = fct.coordinates()
|
coord = fct.coordinates(prec=prec)
|
||||||
nontrivial_part = 0*C.x
|
nontrivial_part = 0*C.x
|
||||||
for i, a in enumerate(C.cohomology_of_structure_sheaf_basis()):
|
for i, a in enumerate(C.cohomology_of_structure_sheaf_basis()):
|
||||||
nontrivial_part += coord[i]*a
|
nontrivial_part += coord[i]*a
|
||||||
@ -13,8 +13,9 @@ def decomposition_g0_g8(fct, prec = 50):
|
|||||||
fct = Fxy(fct.function)
|
fct = Fxy(fct.function)
|
||||||
num = fct.numerator()
|
num = fct.numerator()
|
||||||
den = fct.denominator()
|
den = fct.denominator()
|
||||||
|
integral_part, num = num.quo_rem(den)
|
||||||
aux_den = superelliptic_function(C, Rxy(den))
|
aux_den = superelliptic_function(C, Rxy(den))
|
||||||
g0 = superelliptic_function(C, 0)
|
g0 = superelliptic_function(C, integral_part)
|
||||||
g8 = superelliptic_function(C, 0)
|
g8 = superelliptic_function(C, 0)
|
||||||
for monomial in num.monomials():
|
for monomial in num.monomials():
|
||||||
aux = superelliptic_function(C, monomial)
|
aux = superelliptic_function(C, monomial)
|
||||||
@ -31,7 +32,7 @@ def decomposition_omega0_omega8(omega, prec=50):
|
|||||||
F = C.base_ring
|
F = C.base_ring
|
||||||
delta = C.nb_of_pts_at_infty
|
delta = C.nb_of_pts_at_infty
|
||||||
m = C.exponent
|
m = C.exponent
|
||||||
if sum(omega.residue(place = i, prec = 50) for i in range(delta)) != 0:
|
if sum(omega.residue(place = i, prec = prec) for i in range(delta)) != 0:
|
||||||
raise ValueError(str(omega) + " has non zero residue!")
|
raise ValueError(str(omega) + " has non zero residue!")
|
||||||
Fxy, Rxy, x, y = C.fct_field
|
Fxy, Rxy, x, y = C.fct_field
|
||||||
Rx.<x> = PolynomialRing(F)
|
Rx.<x> = PolynomialRing(F)
|
||||||
|
@ -23,6 +23,13 @@ def second_patch(argument):
|
|||||||
fct1 = Fxy(fct.subs({x : 1/x, y : y/x^(g+1)}))
|
fct1 = Fxy(fct.subs({x : 1/x, y : y/x^(g+1)}))
|
||||||
fct1 *= -x^(-2)
|
fct1 *= -x^(-2)
|
||||||
return superelliptic_form(C1, fct1)
|
return superelliptic_form(C1, fct1)
|
||||||
|
if isinstance(argument, superelliptic_drw_form):
|
||||||
|
h1 = argument.h1
|
||||||
|
omega = argument.omega
|
||||||
|
h2 = argument.h2
|
||||||
|
C = h1.curve
|
||||||
|
return superelliptic_drw_form(-second_patch(h1)*(C.x)^(-2), second_patch(omega), second_patch(h2))
|
||||||
|
|
||||||
|
|
||||||
def lift_form_to_drw(omega):
|
def lift_form_to_drw(omega):
|
||||||
A, B = regular_form(omega)
|
A, B = regular_form(omega)
|
||||||
|
@ -56,6 +56,42 @@ class superelliptic_drw_cech:
|
|||||||
C = self.curve
|
C = self.curve
|
||||||
return superelliptic_cech(C, omega0.h1*C.dx, f.t)
|
return superelliptic_cech(C, omega0.h1*C.dx, f.t)
|
||||||
|
|
||||||
|
def div_by_p(self):
|
||||||
|
'''Given a regular cocycle of the form (V(omega) + dV(h), [f] + V(t), ...), where [f] = 0 in H^1(X, OX),
|
||||||
|
find de Rham cocycle (xi0, f, xi8) such that (V(omega) + dV(h), [f] + V(t), ...) = p*(xi0, f, xi8).'''
|
||||||
|
C = self.curve
|
||||||
|
aux = self
|
||||||
|
Fxy, Rxy, x, y = C.fct_field
|
||||||
|
aux_f_t_0 = decomposition_g0_g8(aux.f.t, prec=50)[0]
|
||||||
|
aux.f.t = 0*C.x
|
||||||
|
aux.omega0 -= aux_f_t_0.teichmuller().diffn()
|
||||||
|
aux.omega8 = aux.omega0 - aux.f.diffn()
|
||||||
|
#
|
||||||
|
omega = aux.omega0.omega
|
||||||
|
omega1 = omega.cartier().cartier()
|
||||||
|
omega1 = omega1.inv_cartier().inv_cartier()
|
||||||
|
fct = (omega.cartier() - omega1.cartier()).int()
|
||||||
|
aux.omega0.h2 += fct^p
|
||||||
|
aux.omega0.omega = omega1
|
||||||
|
if aux.omega0.h2.function in Rxy:
|
||||||
|
aux.f -= aux.omega0.h2.verschiebung()
|
||||||
|
aux.omega0.h2 = 0*C.x
|
||||||
|
if aux.omega8.h2.expansion_at_infty().valuation() >= 0:
|
||||||
|
aux.f += aux.omega8.h2.verschiebung()
|
||||||
|
aux.omega8.h2 = 0*C.x
|
||||||
|
print('aux', aux)
|
||||||
|
# Now aux should be of the form (V(omega1), V(f), V(omega2))
|
||||||
|
# Thus aux = p*(Cartier(omega1), p-th_root(f), Cartier(omega2))
|
||||||
|
aux_divided_by_p = superelliptic_cech(C, aux.omega0.omega.cartier(), aux.f.f.pth_root())
|
||||||
|
print('aux_divided_by_p', aux_divided_by_p)
|
||||||
|
print('is regular', aux_divided_by_p.omega0.is_regular_on_U0(), aux_divided_by_p.omega8.is_regular_on_Uinfty())
|
||||||
|
print('aux.omega0.omega.cartier() - aux.f.f.pth_root().diffn() == aux.omega8.omega.cartier()', aux.omega0.omega.cartier() - aux.f.f.pth_root().diffn() == aux.omega8.omega.cartier())
|
||||||
|
return aux_divided_by_p
|
||||||
|
else:
|
||||||
|
raise ValueError("aux.omega8.h2.expansion_at_infty().valuation() < 0:", aux.omega8.h2.expansion_at_infty())
|
||||||
|
else:
|
||||||
|
raise ValueError("aux.omega0.h2.function not in Rxy:", aux.omega0.h2.function)
|
||||||
|
|
||||||
def coordinates(self, basis = 0):
|
def coordinates(self, basis = 0):
|
||||||
C = self.curve
|
C = self.curve
|
||||||
g = C.genus()
|
g = C.genus()
|
||||||
@ -67,12 +103,7 @@ class superelliptic_drw_cech:
|
|||||||
aux = self
|
aux = self
|
||||||
for i, a in enumerate(basis):
|
for i, a in enumerate(basis):
|
||||||
aux -= coord_lifted[i]*a
|
aux -= coord_lifted[i]*a
|
||||||
print('aux before reduce', aux)
|
aux_divided_by_p = aux.div_by_p()
|
||||||
#aux = aux.reduce() # Now aux = p*cech class.
|
|
||||||
# Now aux should be of the form (V(smth), V(smth), V(smth))
|
|
||||||
print('aux V(smth)', aux)
|
|
||||||
aux_divided_by_p = superelliptic_cech(C, aux.omega0.omega.cartier(), aux.f.f.pth_root())
|
|
||||||
print('aux.omega0.omega.cartier()', aux.omega0.omega.cartier())
|
|
||||||
coord_aux_divided_by_p = aux_divided_by_p.coordinates()
|
coord_aux_divided_by_p = aux_divided_by_p.coordinates()
|
||||||
coord_aux_divided_by_p = [ZZ(a) for a in coord_aux_divided_by_p]
|
coord_aux_divided_by_p = [ZZ(a) for a in coord_aux_divided_by_p]
|
||||||
coordinates = [ (coord_lifted[i] + p*coord_aux_divided_by_p[i])%p^2 for i in range(2*g)]
|
coordinates = [ (coord_lifted[i] + p*coord_aux_divided_by_p[i])%p^2 for i in range(2*g)]
|
||||||
|
@ -17,7 +17,7 @@ class superelliptic_drw_form:
|
|||||||
H = (self.h2 - other.h2).pth_root()
|
H = (self.h2 - other.h2).pth_root()
|
||||||
except:
|
except:
|
||||||
return False
|
return False
|
||||||
eq2 = ((self.omega - other.omega).cartier() - H.diffn()) == 0*self.curve.dx
|
eq2 = ((other.omega - self.omega).cartier() - H.diffn()) == 0*self.curve.dx
|
||||||
if eq1 and eq2:
|
if eq1 and eq2:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
@ -30,7 +30,7 @@ class superelliptic_drw_form:
|
|||||||
result = ""
|
result = ""
|
||||||
if h1.function != 0:
|
if h1.function != 0:
|
||||||
result += "[" + str(h1) + "] d[x]"
|
result += "[" + str(h1) + "] d[x]"
|
||||||
if h1.function !=0 and omega.form != 0:
|
if (h1.function !=0 and omega.form != 0) or (h2.function !=0 and omega.form != 0):
|
||||||
result += " + "
|
result += " + "
|
||||||
if omega.form != 0:
|
if omega.form != 0:
|
||||||
result += "V(" + str(omega) + ")"
|
result += "V(" + str(omega) + ")"
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
p = 3
|
||||||
|
m = 2
|
||||||
|
F = GF(p)
|
||||||
|
Rx.<x> = PolynomialRing(F)
|
||||||
|
f = x^3 - x
|
||||||
|
C = superelliptic(f, m)
|
||||||
|
Rxy.<x, y> = PolynomialRing(F, 2)
|
||||||
|
omega = (((2*C.x^18 + 2*C.x^16 + 2*C.x^14 + 2*C.x^10 + 2*C.x^8 + 2*C.x^4 + 2*C.x^2 + 2*C.one)/(C.x^13 + C.x^11 + C.x^9))*C.y) * C.dx
|
||||||
|
print(decomposition_omega0_omega8(aux.omega)[0] - decomposition_omega0_omega8(aux.omega)[1] == omega and decomposition_omega0_omega8(aux.omega)[0].is_regular_on_U0() and decomposition_omega0_omega8(aux.omega)[1].is_regular_on_Uinfty())
|
||||||
|
h = ((C.x^10 + C.x^8 + C.x^6 + 2*C.x^4 + 2*C.x^2 + 2*C.one)/C.x^6)*C.y
|
||||||
|
print(decomposition_g0_g8(h)[0] - decomposition_g0_g8(h)[1] + decomposition_g0_g8(h)[2] == h and decomposition_g0_g8(h)[0].function in Rxy and decomposition_g0_g8(h)[1].expansion_at_infty().valuation() >= 0)
|
10
sage/superelliptic_drw/tests/superelliptic_drw_tests.sage
Normal file
10
sage/superelliptic_drw/tests/superelliptic_drw_tests.sage
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
p = 3
|
||||||
|
m = 2
|
||||||
|
F = GF(p)
|
||||||
|
Rx.<x> = PolynomialRing(F)
|
||||||
|
f = x^3 - x
|
||||||
|
C = superelliptic(f, m)
|
||||||
|
print(auxilliary_derivative((C.x^3 - C.x).teichmuller()))
|
||||||
|
print('Result should be: [2] d[x] + V((x^8) dx) + dV([2*x^7 + x^5])')
|
||||||
|
print(2*(C.y).teichmuller() * (C.y).teichmuller().diffn() == (C.x^3 - C.x).teichmuller().diffn())
|
||||||
|
print(C.y.teichmuller().diffn().frobenius() == (C.y)^2 * C.y.diffn()) #F(d[y]) = y^2*dy
|
@ -24,4 +24,6 @@ load('superelliptic/tests/a_number_test.sage')
|
|||||||
#print("diffn_test:")
|
#print("diffn_test:")
|
||||||
#load('as_covers/tests/diffn_test.sage')
|
#load('as_covers/tests/diffn_test.sage')
|
||||||
#print("Cartier test:")
|
#print("Cartier test:")
|
||||||
#load('as_covers/tests/cartier_test.sage')
|
#load('as_covers/tests/cartier_test.sage')
|
||||||
|
#print("Decomposition into g0, g8/ omega0, omega8 test:")
|
||||||
|
#load('superelliptic_drw/tests/decomposition_into_g0_g8_tests.sage')
|
Loading…
Reference in New Issue
Block a user