aboutsummaryrefslogtreecommitdiff
path: root/src/cm/cm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cm/cm.c')
-rw-r--r--src/cm/cm.c20
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};