From 13ad6fdecf1067a72c5dd7ae995d890792fda31d Mon Sep 17 00:00:00 2001 From: J08nY Date: Sun, 8 Apr 2018 17:20:18 +0200 Subject: Add p1363_polclass. --- src/cm/p1363.c | 19 ++++++++++--------- src/cm/p1363.h | 37 +++++++++++++++++++++++++++++++++++++ test/src/cm/test_p1363.c | 10 ++++++++++ 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 -- cgit v1.2.3-70-g09d2