diff options
Diffstat (limited to 'src/cm/cm.c')
| -rw-r--r-- | src/cm/cm.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/cm/cm.c b/src/cm/cm.c index 9dffc1d..649df4d 100644 --- a/src/cm/cm.c +++ b/src/cm/cm.c @@ -69,12 +69,14 @@ static void cm_ginit(gen_f *generators, bool prime) { if (prime) { generators[OFFSET_CURVE] = &cm_gen_curve_prime; generators[OFFSET_POINTS] = &points_gen_prime; + } else if (GET_BOOL(unique)) { + generators[OFFSET_CURVE] = &cm_gen_curve_unique; } else { generators[OFFSET_CURVE] = &cm_gen_curve_any; } generators[OFFSET_ORDER] = &cm_gen_order; } else if (cfg->method == METHOD_ANOMALOUS) { - GET(random); // Used within the method. + GET(random); // Used within the method. generators[OFFSET_FIELD] = &anomalous_gen_field; generators[OFFSET_A] = &gen_skip; generators[OFFSET_B] = &anomalous_gen_equation; @@ -181,10 +183,15 @@ static int cm_init(exhaustive_t *setup) { for (long j = 1; j <= len; ++j) { GEN factor = gel(factors, j); if (isprime(factor)) { + debug_log("Adding prime factor %Pi", factor); addprimes(gtovec(factor)); } else { - GEN factored = Z_factor(order); - addprimes(gel(factored, 1)); + GEN factored = Z_factor(factor); + GEN primes = gel(factored, 1); + for (long k = 1; k <= glength(primes); ++k) { + debug_log("Adding prime factor %Pi", gel(primes, k)); + addprimes(gel(primes, k)); + } } order = mulii(order, factor); } @@ -195,6 +202,10 @@ static int cm_init(exhaustive_t *setup) { fprintf(err, "Order requested not a number: %s\n", cfg->cm_order); return 1; } + if (cmpiu(order, 5) < 0) { + pari_fprintf(err, "Order requested too small: %Pi\n", order); + return 1; + } long ord_log = logint0(order, gen_2, NULL); if (ord_log > cfg->bits) { pari_fprintf(err, @@ -226,10 +237,11 @@ static void cm_quit(exhaustive_t *setup) { if (cfg->method == METHOD_ANOMALOUS) { anomalous_quit(); } + cm_any_quit(); exhaustive_clear(setup); } -int cm_do() { +int cm_do(void) { debug_log_start("Starting Complex Multiplication method"); gen_f generators[OFFSET_END] = {NULL}; |
