fix for algebraic closure
This commit is contained in:
parent
660e21d1d1
commit
2705221dbf
@ -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$.
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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):
|
||||||
|
@ -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())
|
|
||||||
|
@ -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)
|
@ -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)
|
@ -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
|
||||||
|
16
tests.sage
16
tests.sage
@ -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:")
|
||||||
|
Loading…
Reference in New Issue
Block a user