Commit e45fa1cc authored by Peter Bruin's avatar Peter Bruin

add and use new optional argument embedding_forms to modular_curve

and modular_curve_jacobian_{medium,large}
parent 9366b4c3
......@@ -185,7 +185,7 @@ reduced_dual_pair.gp: reduced_pairing.gp
intermediate_polynomials_0 intermediate_polynomials_1 intermediate_polynomials_2 \
intermediate_polynomials_3 intermediate_polynomials_4 pairings reduced_pairings
values: primes.gp | form.gp
values: primes.gp | embedding_forms.gp
$(MAKE) $(patsubst %,values_%.gp,$(shell cat $<))
$(MAKE) primes.gp
......
......@@ -105,16 +105,11 @@ modular_curve_jacobian_count_points(GEN group, unsigned long p,
return gerepileupto(av, n);
}
/*
Compute data associated to the modular curve. Modular forms are
computed to sufficient precision to determine the spaces of global
sections of {\cal L}^max_power.
*/
GEN
modular_curve(GEN group, unsigned long p, unsigned long max_power) {
unsigned long degree, dim, genus = modular_group_genus (group), weight,
prec, r, i, s0, s1;
GEN result, forms, V, M, ind, numzeta;
static GEN
compute_embedding_forms(GEN group, ulong p, long max_power) {
long genus = modular_group_genus(group),
degree, dim, weight, prec, r, i;
GEN result, forms, V, M;
char *cache_file;
/*
......@@ -171,25 +166,25 @@ modular_curve(GEN group, unsigned long p, unsigned long max_power) {
for(i = 1; i <= prec - r; i++)
gel(M, i) = vec_ei(prec, r + i);
V = intersect(forms, M);
V = ZM_to_Flm(lift(V), p);
if(lg(V) - 1 != genus + 2)
pari_err(e_MISC, "unexpected dimension");
return rowslice(V, r + 1, r + 1 + max_power*(2*genus + 1));
}
/* Extract the small subspace we are interested in. */
ind = gel(Flm_indexrank(V, p), 1);
if(lg(ind) != lg(V))
pari_err(e_MISC, "dimensions do not agree");
if(ind[1] != r + 1)
pari_err(e_MISC, "strange order of vanishing");
err_printf("using pivots %Ps\n", ind);
s0 = ind[1]; s1 = s0 + max_power*(2*genus + 1);
V = matslice0(V, s0, s1, 1, lg(V) - 1);
/*
Compute data associated to the modular curve. Modular forms are
computed to sufficient precision to determine the spaces of global
sections of {\cal L}^max_power.
*/
GEN
modular_curve(GEN group, ulong p, ulong max_power, GEN embedding_forms) {
GEN V, numzeta;
if (embedding_forms == NULL)
embedding_forms = compute_embedding_forms(group, p, max_power);
V = ZM_to_Flm(liftint(embedding_forms), p);
numzeta = modular_curve_numerator_zeta_function (group, p);
return curve_construct (mkvec2(group, stoi(weight)), p, NULL,
MULTIPLY_POWER_SERIES,
V, max_power, numzeta);
return curve_construct(group, p, NULL, MULTIPLY_POWER_SERIES,
V, max_power, numzeta);
}
GEN
......
......@@ -3,6 +3,6 @@ install(modular_curve_numerator_zeta_function, "GL", , "libmodcurve@shrext@");
install(modular_curve_zeta_function, "GL", , "libmodcurve@shrext@");
install(modular_curve_count_points, "GLD1,L,", , "libmodcurve@shrext@");
install(modular_curve_jacobian_count_points, "GLD1,L,", , "libmodcurve@shrext@");
install(modular_curve, "GLD0,L,", , "libmodcurve@shrext@");
install(modular_curve_jacobian_medium, "GL", , "libmodcurve@shrext@");
install(modular_curve_jacobian_large, "GL", , "libmodcurve@shrext@");
install(modular_curve, "GLD0,L,DG", , "libmodcurve@shrext@");
install(modular_curve_jacobian_medium, "GLDG", , "libmodcurve@shrext@");
install(modular_curve_jacobian_large, "GLDG", , "libmodcurve@shrext@");
......@@ -7,7 +7,7 @@ GEN modular_curve_zeta_function(GEN group, unsigned long p);
GEN modular_curve_count_points(GEN group, unsigned long p, unsigned long k);
GEN modular_curve_jacobian_count_points(GEN group, unsigned long p,
unsigned long k);
GEN modular_curve(GEN group, unsigned long p, unsigned long max_power);
GEN modular_curve(GEN group, ulong p, ulong max_power, GEN embedding_forms);
GEN modular_curve_distinguished_point(GEN X);
#endif
......@@ -15,14 +15,14 @@
GEN
modular_curve_jacobian_medium(GEN group, unsigned long p) {
return curve_jacobian (modular_curve (group, p, 8),
modular_curve_jacobian_medium(GEN group, ulong p, GEN embedding_forms) {
return curve_jacobian (modular_curve(group, p, 8, embedding_forms),
JACOBIAN_TYPE_MEDIUM);
}
GEN
modular_curve_jacobian_large(GEN group, unsigned long p) {
return curve_jacobian (modular_curve (group, p, 9),
modular_curve_jacobian_large(GEN group, ulong p, GEN embedding_forms) {
return curve_jacobian (modular_curve(group, p, 9, embedding_forms),
JACOBIAN_TYPE_LARGE);
}
......
#ifndef MODULAR_JACOBIAN
#define MODULAR_JACOBIAN
GEN modular_curve_jacobian_medium(GEN group, unsigned long p);
GEN modular_curve_jacobian_large(GEN group, unsigned long p);
GEN modular_curve_jacobian_medium(GEN group, ulong p, GEN embedding_forms);
GEN modular_curve_jacobian_large(GEN group, ulong p, GEN embedding_forms);
GEN modular_jacobian_normalised_divisor (GEN X, GEN W_D, GEN W_rO);
#endif
......@@ -369,7 +369,7 @@ torsion_subscheme(GEN Gamma, unsigned long l, unsigned long p,
/*
Compute the Jacobian and its base change to the right field.
*/
J = modular_curve_jacobian_medium(Gamma, p);
J = modular_curve_jacobian_medium(Gamma, p, gp_read_file("embedding_forms.gp"));
err_printf("working with curve of genus %li with projective"
" embedding of degree %li into P^%li\n",
curve_genus(J), curve_degree(J), lg(curve_V(J, 1)) - 2);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment