aboutsummaryrefslogtreecommitdiff
path: root/src/cm
diff options
context:
space:
mode:
Diffstat (limited to 'src/cm')
-rw-r--r--src/cm/custom.c87
-rw-r--r--src/cm/custom.h4
2 files changed, 17 insertions, 74 deletions
diff --git a/src/cm/custom.c b/src/cm/custom.c
index 0ebd708..fd58364 100644
--- a/src/cm/custom.c
+++ b/src/cm/custom.c
@@ -36,14 +36,16 @@ static size_t custom_add_primes(GEN r, GEN order, GEN **primes,
} else {
pstar = gcopy(pstar);
}
- (*primes)[nprimes++] = pstar;
if (nprimes == nalloc) {
nalloc *= 2;
*primes = try_realloc(*primes, sizeof(GEN) * nalloc);
}
+ (*primes)[nprimes++] = pstar;
}
}
+ *primes = try_realloc(*primes, sizeof(GEN) * nprimes);
+
return nprimes;
}
@@ -65,9 +67,9 @@ static void custom_quadr_next(custom_quadr_t *quadr) {
// Then continue with i
GEN logN = ground(glog(quadr->order, BIGDEFAULTPREC));
- GEN rlog2 = sqri(mulii(quadr->r, logN));
+ GEN rlog2 = sqri(mulii(addis(quadr->r, 1), logN));
- // When Do I want more primes? If i == imax, or nprimes == 0
+ // When do I want more primes? If i == imax, or nprimes == 0
GEN imax = int2n(quadr->nprimes);
if (equalii(quadr->i, imax) || quadr->nprimes == 0) {
quadr->nprimes = custom_add_primes(quadr->r, quadr->order, &(quadr->Sp),
@@ -78,7 +80,7 @@ static void custom_quadr_next(custom_quadr_t *quadr) {
imax = int2n(quadr->nprimes);
while (cmpii(quadr->i, imax) < 0) {
- debug_log("i %Pi", quadr->i);
+ // debug_log("i %Pi", quadr->i);
pari_sp btop = avma;
GEN pprod = gen_1;
bits_t *ibits = bits_from_i_len(quadr->i, quadr->nprimes);
@@ -89,11 +91,15 @@ static void custom_quadr_next(custom_quadr_t *quadr) {
}
}
bits_free(&ibits);
- if (cmpii(pprod, rlog2) < 0 && equalii(modis(pprod, 8), stoi(5))) {
- debug_log("candidate D = %Pi, rlog2 = %Pi", pprod, rlog2);
+
+ GEN absp = absi(pprod);
+ long m4 = mod4(absp);
+ if (cmpii(absp, rlog2) < 0 && equalii(modis(pprod, 8), stoi(5)) &&
+ m4 != 1 && m4 != 2) {
+ debug_log("candidate D = %Pi", pprod);
GEN x;
GEN y;
- if (!cornacchia2(negi(pprod), quadr->order, &x, &y)) {
+ if (!cornacchia2(absp, quadr->order, &x, &y)) {
avma = btop;
quadr->i = addis(quadr->i, 1);
// debug_log("Cornacchia fail");
@@ -125,77 +131,12 @@ static void custom_quadr_next(custom_quadr_t *quadr) {
quadr->r = addis(quadr->r, 1);
quadr->nprimes = custom_add_primes(quadr->r, quadr->order, &(quadr->Sp),
quadr->nprimes);
- rlog2 = sqri(mulii(quadr->r, logN));
+ rlog2 = sqri(mulii(addis(quadr->r, 1), logN));
}
}
static void custom_quadr_free(custom_quadr_t *quadr) { try_free(quadr->Sp); }
-/*
-static custom_quadr_t custom_quadr(GEN order) {
- pari_sp ltop = avma;
- custom_quadr_t result = {0};
-
- GEN r = gen_0;
- GEN *Sp;
- size_t nprimes = custom_add_primes(r, order, &Sp, 0);
-
- GEN logN = ground(glog(order, BIGDEFAULTPREC));
- GEN rlog2 = sqri(mulii(r, logN));
-
- GEN i = gen_0;
-
- while (true) {
- GEN imax = int2n(nprimes);
-
- while (cmpii(i, imax) < 0) {
- // debug_log("i %Pi", i);
- pari_sp btop = avma;
- GEN pprod = gen_1;
- bits_t *ibits = bits_from_i_len(i, nprimes);
- for (size_t j = 0; j < nprimes; ++j) {
- if (GET_BIT(ibits->bits, j) == 1) {
- // debug_log("multiplying %Pi", Sp[j]);
- pprod = mulii(pprod, Sp[j]);
- }
- }
- bits_free(&ibits);
- if (cmpii(pprod, rlog2) < 0 && equalii(modis(pprod, 8), stoi(5))) {
- // debug_log("candidate D = %Pi", pprod);
- GEN x;
- GEN y;
- cornacchia2(negi(pprod), order, &x, &y);
- GEN pp1 = addii(addis(order, 1), x);
- GEN pp2 = subii(addis(order, 1), x);
- if (isprime(pp1)) {
- result.p = pp1;
- result.D = pprod;
- result.t = x;
- gerepileall(ltop, 3, &result.p, &result.t,
- &result.D);
- try_free(Sp);
- return result;
- }
- if (isprime(pp2)) {
- result.p = pp2;
- result.D = pprod;
- result.t = x;
- gerepileall(ltop, 3, &result.p, &result.t,
- &result.D);
- try_free(Sp);
- return result;
- }
- }
- avma = btop;
- i = addis(i, 1);
- }
-
- r = addis(r, 1);
- nprimes = custom_add_primes(r, order, &Sp, nprimes);
- }
-}
-*/
-
curve_t *custom_curve() {
GEN order = strtoi(cfg->cm_order);
if (!isprime(order)) {
diff --git a/src/cm/custom.h b/src/cm/custom.h
index 221c8be..ddb89fe 100644
--- a/src/cm/custom.h
+++ b/src/cm/custom.h
@@ -23,7 +23,9 @@ typedef struct {
} custom_quadr_t;
/**
- * @brief
+ * Algorithm mostly from:
+ * Constructing elliptic curves of prime order
+ * by Reinier Broker and Peter Stevenhagen
* @return
*/
curve_t* custom_curve();