fix for algebraic closure

This commit is contained in:
jgarnek 2023-11-29 08:50:29 +00:00
parent 660e21d1d1
commit 2705221dbf
11 changed files with 93 additions and 55 deletions

View File

@ -99,9 +99,9 @@ One can check valuation of form/function at given place at infinity, using *valu
## Abelian covers of superelliptic curves ## Abelian covers of superelliptic curves
This module allows to define $(\mathbb Z/p)^n$-covers of superelliptic curves in characteristic $p$ that This module allows to define $(\mathbb Z/p)^n$\-covers of superelliptic curves in characteristic $p$ that
are **ramified over the points of infinity**. are **ramified over the points of infinity**.
We define now a $(\mathbb Z/3)^2$ cover of curve $C : y^2 = x^3 + x$, given by the equations $z_0^3 - z_0 = x^2 * y$, We define now a $(\mathbb Z/3)^2$ cover of curve $C : y^2 = x^3 + x$, given by the equations $z_0^3 - z_0 = x^2 y$,
$z_1^3 - z_1 = x^3$. $z_1^3 - z_1 = x^3$.
``` ```

View File

@ -1,4 +1,4 @@
def magma_module_decomposition(A, B, text = False, prefix="", sufix=""): def magma_module_decomposition(A, B, text = False, prefix="", sufix="", matrices=True):
"""Find decomposition of Z/p^2-module given by matrices A, B into indecomposables using magma. """Find decomposition of Z/p^2-module given by matrices A, B into indecomposables using magma.
If text = True, print the command for Magma. Else - return the output of Magma free.""" If text = True, print the command for Magma. Else - return the output of Magma free."""
q = parent(A).base_ring().order() q = parent(A).base_ring().order()
@ -18,7 +18,8 @@ def magma_module_decomposition(A, B, text = False, prefix="", sufix=""):
result += ">;" result += ">;"
result += "M := RModule(RSpace(GF("+str(q)+")," + str(n) + "), A);" result += "M := RModule(RSpace(GF("+str(q)+")," + str(n) + "), A);"
result += "L := IndecomposableSummands(M); L;" result += "L := IndecomposableSummands(M); L;"
result += "for i in [1 .. #L] do print(Generators(Action(L[i]))); end for;" if matrices:
result += "for i in [1 .. #L] do print(Generators(Action(L[i]))); end for;"
result += sufix result += sufix
if text: if text:
return result return result

View File

@ -35,6 +35,12 @@ class as_cech:
f1 = other.f f1 = other.f
return as_cech(C, omega - omega1, f - f1) return as_cech(C, omega - omega1, f - f1)
def __neg__(self):
C = self.curve
omega = self.omega0
f = self.f
return as_cech(C, -omega, -f)
def __rmul__(self, constant): def __rmul__(self, constant):
C = self.curve C = self.curve
omega = self.omega0 omega = self.omega0

View File

@ -71,6 +71,11 @@ class as_form:
g2 = other.form g2 = other.form
return as_form(C, g1 - g2) return as_form(C, g1 - g2)
def __neg__(self):
C = self.curve
g = self.form
return as_form(C, -g)
def __rmul__(self, constant): def __rmul__(self, constant):
C = self.curve C = self.curve
omega = self.form omega = self.form

View File

@ -33,6 +33,11 @@ class as_function:
g = self.function g = self.function
return as_function(C, constant*g) return as_function(C, constant*g)
def __neg__(self, other):
C = self.curve
g = self.function
return as_function(C, -g)
def __mul__(self, other): def __mul__(self, other):
if isinstance(other, as_function): if isinstance(other, as_function):
C = self.curve C = self.curve

View File

@ -9,14 +9,15 @@ def group_action_matrices(space, list_of_group_elements, basis):
A[i][:, j] = vector(v1) A[i][:, j] = vector(v1)
return A return A
def group_action_matrices_holo(AS): def group_action_matrices_holo(AS, basis=0, threshold=10):
n = AS.height n = AS.height
generators = [] generators = []
for i in range(n): for i in range(n):
ei = n*[0] ei = n*[0]
ei[i] = 1 ei[i] = 1
generators += [ei] generators += [ei]
basis = AS.holomorphic_differentials_basis() if basis == 0:
basis = AS.holomorphic_differentials_basis(threshold=threshold)
return group_action_matrices(basis, generators, basis = basis) return group_action_matrices(basis, generators, basis = basis)
def group_action_matrices_dR(AS, threshold=8): def group_action_matrices_dR(AS, threshold=8):

View File

@ -1,8 +1,7 @@
p = 5 p = 3
m = 1 F = GF(p^2, 'a')
F = GF(p) #F1 = F.algebraic_closure('t')
Rx.<x> = PolynomialRing(F) a = F.gens()[0]
f = x R.<x> = PolynomialRing(F)
C = superelliptic(f, 1) P1 = superelliptic(x, 1)
AS1 = as_cover(C, [C.x^3], prec = 200) AS = as_cover(P1, [P1.x^2, a*P1.x^2])
print(AS1.genus())

View File

@ -1,5 +1,18 @@
F = GF(2) def reduction(g):
A = matrix(F, [[1, 1, 1], [0, 0, 1], [0, 1, 0]]) F = g.parent().base()
B = matrix(F, [[0, 0, 1], [1, 1, 1], [1, 0, 0]]) x, y = g.parent().gens()
print(A^2 == identity_matrix(3), B^2 == identity_matrix(3), A*B == B*A) Rxy.<x, y> = PolynomialRing(F, 2)
print(magmathis(A, B)) Fxy = FractionField(Rxy)
Rx.<x> = PolynomialRing(F)
Fx = FractionField(Rx)
FxRy.<y> = PolynomialRing(Fx)
g = Fxy(g)
g1 = g.numerator()
g2 = g.denominator()
print('aa', FxRy(g2))
F = GF(3).algebraic_closure()
R.<x, y> = PolynomialRing(F, 2)
g = x
reduction(g)

View File

@ -238,40 +238,44 @@ class superelliptic:
b += M b += M
return (C.x)^a/(C.y)^b return (C.x)^a/(C.y)^b
def reduction(C, g): def reduction(curve, g):
'''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)
it replaces repeteadly all y^m's in g(x, y) by f(x). As a result it replaces repeteadly all y^m's in g(x, y) by f(x). As a result
you obtain sum_{i = 0}^{m-1} y^i g_i(x).''' you obtain sum_{i = 0}^{m-1} y^i g_i(x).'''
p = C.characteristic p = curve.characteristic
F = C.base_ring F = curve.base_ring
Rxy.<x, y> = PolynomialRing(F, 2) Fxy, Rxy, x, y = curve.fct_field
Fxy = FractionField(Rxy) f = curve.polynomial
f = C.polynomial
r = f.degree() r = f.degree()
m = C.exponent m = curve.exponent
g = Fxy(g) g = Fxy(g)
g1 = g.numerator() g1 = g.numerator()
g2 = g.denominator() g2 = g.denominator()
Rx.<x> = PolynomialRing(F) Rx.<x> = PolynomialRing(F)
Fx = FractionField(Rx) Fx = FractionField(Rx)
FxRy.<y> = PolynomialRing(Fx) FxRy1.<y> = PolynomialRing(Fx, 1) #coercion problems from Rxy to FxRy
(A, B, C) = xgcd(FxRy(g2), FxRy(y^m - f)) FxRy.<y2> = PolynomialRing(Fx) #coercion problems from Rxy to FxRy
g = FxRy(g1*B/A) (A, B, C) = xgcd(FxRy(FxRy1(g2)(y = y2)), FxRy(FxRy1(y^m - f)(y = y2))) #coercion problems from Rxy to FxRy
g = FxRy(FxRy1(g1)(y = y2))*B/A
g = FxRy(g)
while(g.degree(Rxy(y)) >= m): while(g.degree(y2) >= m):
d = g.degree(Rxy(y)) d = g.degree(y2)
G = coff(g, d) G = coff(g, d)
i = floor(d/m) i = floor(d/m)
g = g - G*y^d + f^i * y^(d%m) *G g = g - G*y2^d + f^i * y2^(d%m) *G
Rxy1.<x3, y3> = PolynomialRing(F, 2)
return(FxRy(g)) Fxy1 = FractionField(Rxy1)
g = sum(Fxy(y3)^i*Fx(coff(g, i)) for i in range(0, m))
g = Fxy(g)
return(g)
#Auxilliary. Given a superelliptic curve C : y^m = f(x) and a polynomial g(x, y)
#it replaces repeteadly all y^m's in g(x, y) by f(x). As a result
#you obtain \sum_{i = 0}^{m-1} g_i(x)/y^i. This is needed for reduction of
#superelliptic forms.
def reduction_form(C, g): def reduction_form(C, g):
'''Auxilliary. Given a superelliptic curve C : y^m = f(x) and a polynomial g(x, y)
it replaces repeteadly all y^m's in g(x, y) by f(x). As a result
you obtain sum_{i = 0}^{m-1} g_i(x)/y^i. This is needed for reduction of
superelliptic forms.'''
F = C.base_ring F = C.base_ring
Rxy.<x, y> = PolynomialRing(F, 2) Rxy.<x, y> = PolynomialRing(F, 2)
Fxy = FractionField(Rxy) Fxy = FractionField(Rxy)
@ -283,14 +287,15 @@ def reduction_form(C, g):
g1 = Rxy(0) g1 = Rxy(0)
Rx.<x> = PolynomialRing(F) Rx.<x> = PolynomialRing(F)
Fx = FractionField(Rx) Fx = FractionField(Rx)
FxRy.<y> = PolynomialRing(Fx) FxRy1.<y> = PolynomialRing(Fx, 1)
FxRy.<y2> = PolynomialRing(Fx)
g = FxRy(g) g = FxRy(FxRy1(g)(y = y2))
for j in range(0, m): for j in range(0, m):
if j==0: if j==0:
G = coff(g, 0) G = coff(g, 0)
g1 += FxRy(G) g1 += Fxy(Fx(G))
else: else:
G = coff(g, j) G = coff(g, j)
g1 += Fxy(y^(j-m)*f*G) g1 += Fxy(y)^(j-m)*Fxy(Fx(f*G))
return(g1) return(g1)

View File

@ -101,14 +101,17 @@ class superelliptic_form:
C = self.curve C = self.curve
m = C.exponent m = C.exponent
F = C.base_ring F = C.base_ring
Fxy, Rxy, x, y = C.fct_field
g = reduction(C, y^m*g)
Rx.<x> = PolynomialRing(F) Rx.<x> = PolynomialRing(F)
Fx = FractionField(Rx) Fx = FractionField(Rx)
FxRy.<y> = PolynomialRing(Fx) FxRy.<y1> = PolynomialRing(Fx, 1)
g = reduction(C, y^m*g) print('a')
g = FxRy(g) g = FxRy(g(x = x, y = y1))
print('b')
if j == 0: if j == 0:
return g.monomial_coefficient(y^(0))/C.polynomial return g.monomial_coefficient(y1^(0))/C.polynomial
return g.monomial_coefficient(y^(m-j)) return g.monomial_coefficient(y1^(m-j))
def is_regular_on_U0(self): def is_regular_on_U0(self):
C = self.curve C = self.curve

View File

@ -1,16 +1,16 @@
#load('init.sage') #load('init.sage')
print("Expansion at infty test:") print("Expansion at infty test:")
load('superelliptic/tests/expansion_at_infty.sage') load('superelliptic/tests/expansion_at_infty.sage')
#print("superelliptic form coordinates test:") print("superelliptic form coordinates test:")
#load('superelliptic/tests/form_coordinates_test.sage') load('superelliptic/tests/form_coordinates_test.sage')
#print("p-th root test:") print("p-th root test:")
#load('superelliptic/tests/pth_root_test.sage') load('superelliptic/tests/pth_root_test.sage')
#print("not working! superelliptic p rank test:") #print("not working! superelliptic p rank test:")
#load('superelliptic/tests/p_rank_test.sage') #load('superelliptic/tests/p_rank_test.sage')
#print("a-number test:") print("a-number test:")
#load('superelliptic/tests/a_number_test.sage') load('superelliptic/tests/a_number_test.sage')
#print("as_cover_test:") print("as_cover_test:")
#load('as_covers/tests/as_cover_test.sage') load('as_covers/tests/as_cover_test.sage')
#print("group_action_matrices_test:") #print("group_action_matrices_test:")
#load('as_covers/tests/group_action_matrices_test.sage') #load('as_covers/tests/group_action_matrices_test.sage')
#print("dual_element_test:") #print("dual_element_test:")