aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cm/p1363.c19
-rw-r--r--src/cm/p1363.h37
-rw-r--r--test/src/cm/test_p1363.c10
3 files changed, 57 insertions, 9 deletions
diff --git a/src/cm/p1363.c b/src/cm/p1363.c
index 0485849..fad2a05 100644
--- a/src/cm/p1363.c
+++ b/src/cm/p1363.c
@@ -134,6 +134,7 @@ static GEN p1363_func_fzero(GEN D, p1363_form_t *form, long precision) {
GEN result = gmul(divd, front);
+ // TODO: WHY????
gel(result, 2) = gneg(gel(result, 2));
return gerepilecopy(ltop, result);
@@ -331,15 +332,6 @@ static void p1363_theta(GEN D, p1363_form_t *form, long precision) {
form->theta = gerepilecopy(ltop, gexp(quot, precision));
}
-/**
- * Bit-precision computation for a Weber class polynomial from:
- * On the Efficient Generation of Elliptic Curves,
- * Elisavet Konstantinou, Yiannis C. Stamatiou, Christos Zaroliagis
- * @param D
- * @param forms
- * @param nforms
- * @return The pari precision required for W_D.
- */
long p1363_bit_precision(GEN D, p1363_form_t **forms, size_t nforms) {
pari_sp ltop = avma;
long v0 = 64;
@@ -449,3 +441,12 @@ GEN p1363_poly(GEN D, p1363_form_t **forms, size_t nforms) {
}
return gerepilecopy(ltop, result);
}
+
+GEN p1363_polclass(GEN D) {
+ pari_sp ltop = avma;
+ p1363_form_t **forms;
+ size_t nforms = p1363_forms(D, &forms);
+ GEN WD = p1363_poly(D, forms, nforms);
+ p1363_free(&forms, nforms);
+ return gerepileupto(ltop, WD);
+} \ No newline at end of file
diff --git a/src/cm/p1363.h b/src/cm/p1363.h
index 7201d80..1064eda 100644
--- a/src/cm/p1363.h
+++ b/src/cm/p1363.h
@@ -28,14 +28,51 @@ typedef struct {
GEN theta;
} p1363_form_t;
+/**
+ * Compute all the primitive reduced quadratic forms for a given discriminant.
+ * @param D
+ * @param forms
+ * @return
+ */
size_t p1363_forms(GEN D, p1363_form_t ***forms);
+/**
+ * Free the computed quadratic forms.
+ * @param forms
+ * @param nforms
+ */
void p1363_free(p1363_form_t ***forms, size_t nforms);
+/**
+ * Compute the class invariant for discriminant D and form.
+ * @param D
+ * @param form
+ * @param precision
+ * @return
+ */
GEN p1363_invariant(GEN D, p1363_form_t *form, long precision);
+/**
+ * Bit-precision computation for a Weber class polynomial from:
+ * On the Efficient Generation of Elliptic Curves,
+ * Elisavet Konstantinou, Yiannis C. Stamatiou, Christos Zaroliagis
+ * @param D
+ * @param forms
+ * @param nforms
+ * @return The pari precision required for W_D.
+ */
long p1363_bit_precision(GEN D, p1363_form_t **forms, size_t nforms);
+/**
+ * Compute the reduced Webe class polynomial for discriminant D and quadratic
+ * forms.
+ * @param D
+ * @param forms
+ * @param nforms
+ * @return
+ */
GEN p1363_poly(GEN D, p1363_form_t **forms, size_t nforms);
+GEN p1363_polclass(GEN D);
+
#endif // ECGEN_CM_P1363_H
diff --git a/test/src/cm/test_p1363.c b/test/src/cm/test_p1363.c
index 6df19db..6ff3c10 100644
--- a/test/src/cm/test_p1363.c
+++ b/test/src/cm/test_p1363.c
@@ -50,4 +50,14 @@ Test(p1363, test_p1363_poly) {
mkvecn(8, gen_1, gen_m2, gen_m1, gen_1, gen_1, gen_1, gen_m1, gen_m1);
cr_assert(gequal(coeffs, expected), );
p1363_free(&forms, nforms);
+}
+
+Test(p1363, test_p1363_polclass) {
+ GEN WD = p1363_polclass(stoi(71));
+
+ GEN coeffs = gtovec(WD);
+
+ GEN expected =
+ mkvecn(8, gen_1, gen_m2, gen_m1, gen_1, gen_1, gen_1, gen_m1, gen_m1);
+ cr_assert(gequal(coeffs, expected), );
} \ No newline at end of file