aboutsummaryrefslogtreecommitdiff
path: root/src/cm/p1363.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cm/p1363.c')
-rw-r--r--src/cm/p1363.c52
1 files changed, 37 insertions, 15 deletions
diff --git a/src/cm/p1363.c b/src/cm/p1363.c
index 3c1bf8c..119b0cb 100644
--- a/src/cm/p1363.c
+++ b/src/cm/p1363.c
@@ -5,7 +5,7 @@
#include "p1363.h"
#include "util/memory.h"
-GEN p1363_group(GEN D) {
+static GEN p1363_group(GEN D) {
pari_sp ltop = avma;
GEN s = mpfloor(sqrtr(rdivis(D, 3, BIGDEFAULTPREC)));
long llen = itos(s) * 2;
@@ -49,11 +49,11 @@ GEN p1363_group(GEN D) {
return gerepilecopy(ltop, vec_shorten(l, j - 1));
}
-long p1363_num(GEN group) { return glength(group); }
+static size_t p1363_num(GEN group) { return (size_t)glength(group); }
size_t p1363_forms(GEN D, p1363_form_t ***forms) {
GEN group = p1363_group(D);
- size_t nforms = (size_t)p1363_num(group);
+ size_t nforms = p1363_num(group);
*forms = try_calloc(nforms * sizeof(p1363_form_t *));
for (size_t i = 0; i < nforms; ++i) {
@@ -79,7 +79,7 @@ void p1363_free(p1363_form_t ***forms, size_t nforms) {
}
}
-GEN p1363_func_F(GEN z) {
+static GEN p1363_func_F(GEN z) {
pari_sp ltop = avma;
if (gequal0(z)) {
@@ -117,7 +117,7 @@ GEN p1363_func_F(GEN z) {
return gerepilecopy(ltop, sum);
}
-GEN p1363_func_fzero(GEN D, p1363_form_t *form) {
+static GEN p1363_func_fzero(GEN D, p1363_form_t *form) {
pari_sp ltop = avma;
GEN upper = p1363_func_F(gneg(form->theta));
@@ -129,7 +129,7 @@ GEN p1363_func_fzero(GEN D, p1363_form_t *form) {
return gerepilecopy(ltop, result);
}
-GEN p1363_func_fone(GEN D, p1363_form_t *form) {
+static GEN p1363_func_fone(GEN D, p1363_form_t *form) {
pari_sp ltop = avma;
GEN upper = p1363_func_F(form->theta);
@@ -141,7 +141,7 @@ GEN p1363_func_fone(GEN D, p1363_form_t *form) {
return gerepilecopy(ltop, result);
}
-GEN p1363_func_ftwo(GEN D, p1363_form_t *form) {
+static GEN p1363_func_ftwo(GEN D, p1363_form_t *form) {
pari_sp ltop = avma;
GEN upper = p1363_func_F(gpowgs(form->theta, 4));
@@ -154,9 +154,9 @@ GEN p1363_func_ftwo(GEN D, p1363_form_t *form) {
return gerepilecopy(ltop, result);
}
-void p1363_m8(GEN D, p1363_form_t *form) { form->m8 = mod8(D); }
+static void p1363_m8(GEN D, p1363_form_t *form) { form->m8 = mod8(D); }
-void p1363_I(GEN D, p1363_form_t *form) {
+static void p1363_I(GEN D, p1363_form_t *form) {
switch (form->m8) {
case 1:
case 2:
@@ -179,7 +179,7 @@ void p1363_I(GEN D, p1363_form_t *form) {
}
}
-void p1363_J(GEN D, p1363_form_t *form) {
+static void p1363_J(GEN D, p1363_form_t *form) {
pari_sp ltop = avma;
GEN ac = mulii(form->A, form->C);
@@ -197,7 +197,7 @@ void p1363_J(GEN D, p1363_form_t *form) {
avma = ltop;
}
-void p1363_K(GEN D, p1363_form_t *form) {
+static void p1363_K(GEN D, p1363_form_t *form) {
switch (form->m8) {
case 1:
case 2:
@@ -243,7 +243,7 @@ void p1363_L(GEN D, p1363_form_t *form) {
form->L = gerepileupto(ltop, form->L);
}
-void p1363_M(GEN D, p1363_form_t *form) {
+static void p1363_M(GEN D, p1363_form_t *form) {
pari_sp ltop = avma;
GEN quot;
if (mod2(form->A) == 0) {
@@ -254,7 +254,7 @@ void p1363_M(GEN D, p1363_form_t *form) {
form->M = gerepileupto(ltop, powii(gen_m1, quot));
}
-void p1363_N(GEN D, p1363_form_t *form) {
+static void p1363_N(GEN D, p1363_form_t *form) {
pari_sp ltop = avma;
long ac2 = mod2(mulii(form->A, form->C));
@@ -287,14 +287,14 @@ void p1363_N(GEN D, p1363_form_t *form) {
form->N = gerepileupto(ltop, form->N);
}
-void p1363_lambda(GEN D, p1363_form_t *form) {
+static void p1363_lambda(GEN D, p1363_form_t *form) {
pari_sp ltop = avma;
GEN pik = mulri(mppi(BIGDEFAULTPREC), stoi(form->K));
GEN quot = divrs(pik, 24);
form->lambda = gerepileupto(ltop, expIr(quot));
}
-void p1363_theta(GEN D, p1363_form_t *form) {
+static void p1363_theta(GEN D, p1363_form_t *form) {
pari_sp ltop = avma;
GEN upper = gadd(gneg(gsqrt(D, BIGDEFAULTPREC)), gmul(form->B, gen_I()));
@@ -303,6 +303,28 @@ void p1363_theta(GEN D, p1363_form_t *form) {
form->theta = gerepileupto(ltop, gexp(quot, BIGDEFAULTPREC));
}
+/**
+ * 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
+ */
+static long p1363_bit_precision(GEN D, p1363_form_t **forms, size_t nforms) {
+ pari_sp ltop = avma;
+ long v0 = 32;
+ GEN mul = divrr(mulrr(mppi(BIGDEFAULTPREC), sqrti(D)), mplog2(BIGDEFAULTPREC));
+ GEN sum = gen_0;
+ for (size_t i = 0; i < nforms; ++i) {
+ sum = gadd(sum, ginv(forms[i]->A));
+ }
+ long result = v0 + itos(mpceil(mulrr(mul, sum)));
+ avma = ltop;
+ return result;
+}
+
GEN p1363_invariant(GEN D, p1363_form_t *form) {
pari_printf("[A,B,C] = %Pi %Pi %Pi\n", form->A, form->B, form->C);
pari_sp ltop = avma;