aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2017-09-29 19:45:41 +0200
committerJ08nY2017-09-29 19:45:41 +0200
commit67c88571068fe34ebf21d53ed9d872332450eb48 (patch)
tree7992939df70b58c30dda82e299dc4b910ae7d84e
parent33e634568f368ebf108caa16e4adb2fabece565b (diff)
downloadecgen-67c88571068fe34ebf21d53ed9d872332450eb48.tar.gz
ecgen-67c88571068fe34ebf21d53ed9d872332450eb48.tar.zst
ecgen-67c88571068fe34ebf21d53ed9d872332450eb48.zip
-rw-r--r--src/exhaustive/check.c21
-rw-r--r--src/exhaustive/check.h2
-rw-r--r--src/exhaustive/exhaustive.c26
-rw-r--r--src/gen/curve.c8
-rw-r--r--src/gen/curve.h15
-rw-r--r--src/invalid/invalid.c23
6 files changed, 60 insertions, 35 deletions
diff --git a/src/exhaustive/check.c b/src/exhaustive/check.c
index 1492b3c..1549af8 100644
--- a/src/exhaustive/check.c
+++ b/src/exhaustive/check.c
@@ -5,10 +5,29 @@
#include "check.h"
#include "util/memory.h"
-check_t *check_new(void) { return try_calloc(sizeof(check_t)); }
+check_t *check_new(check_f one, ...) {
+ check_t *result = try_calloc(sizeof(check_t));
+ result->checks = try_calloc(sizeof(check_f));
+ result->checks[0] = one;
+ result->nchecks = 1;
+
+ va_list args;
+ va_start(args, one);
+ check_f check;
+ while ((check = va_arg(args, check_f)) != NULL) {
+ result->checks = try_realloc(result->checks, ++result->nchecks);
+ result->checks[result->nchecks - 1] = check;
+ }
+ va_end(args);
+
+ return result;
+}
void check_free(check_t **check) {
if (*check) {
+ if ((*check)->checks) {
+ try_free((*check)->checks);
+ }
try_free(*check);
*check = NULL;
}
diff --git a/src/exhaustive/check.h b/src/exhaustive/check.h
index d5584da..62416a8 100644
--- a/src/exhaustive/check.h
+++ b/src/exhaustive/check.h
@@ -14,7 +14,7 @@
* @brief
* @return
*/
-check_t *check_new(void);
+check_t *check_new(check_f one, ...);
/**
* @brief
diff --git a/src/exhaustive/exhaustive.c b/src/exhaustive/exhaustive.c
index 3e39a82..6c8c83d 100644
--- a/src/exhaustive/exhaustive.c
+++ b/src/exhaustive/exhaustive.c
@@ -3,8 +3,10 @@
* Copyright (C) 2017 J08nY
*/
#include "exhaustive.h"
+#include <misc/types.h>
#include "anomalous.h"
#include "ansi.h"
+#include "check.h"
#include "gen/curve.h"
#include "gen/equation.h"
#include "gen/field.h"
@@ -41,7 +43,6 @@ static void exhaustive_ginit(gen_f *generators, const config_t *cfg) {
default:
break;
}
- generators[OFFSET_CURVE] = &curve_gen_nonzero;
generators[OFFSET_ORDER] = &order_gen_any;
} else {
// setup normal generators
@@ -72,8 +73,6 @@ static void exhaustive_ginit(gen_f *generators, const config_t *cfg) {
generators[OFFSET_B] = &b_gen_one;
}
- generators[OFFSET_CURVE] = &curve_gen_nonzero;
-
if (cfg->prime) {
generators[OFFSET_ORDER] = &order_gen_prime;
} else if (cfg->cofactor) {
@@ -84,8 +83,9 @@ static void exhaustive_ginit(gen_f *generators, const config_t *cfg) {
generators[OFFSET_ORDER] = &order_gen_any;
}
}
-
// setup common generators
+ generators[OFFSET_CURVE] = &curve_gen_any;
+
if (cfg->unique) {
generators[OFFSET_GENERATORS] = &gens_gen_one;
} else {
@@ -123,7 +123,10 @@ static void exhaustive_ginit(gen_f *generators, const config_t *cfg) {
}
}
-static void exhaustive_cinit(check_t **validators, const config_t *cfg) {}
+static void exhaustive_cinit(check_t **validators, const config_t *cfg) {
+ check_t *curve_check = check_new(curve_check_nonzero, NULL);
+ validators[OFFSET_CURVE] = curve_check;
+}
static void exhaustive_ainit(arg_t **argss, const config_t *cfg) {
if (cfg->anomalous) {
@@ -202,7 +205,7 @@ int exhaustive_gen_retry(curve_t *curve, const config_t *cfg,
if (diff > 0 && validators && validators[state]) {
check_t *validator = validators[state];
for (size_t i = 0; i < validator->nchecks; ++i) {
- int new_diff = validator->checks[state](curve, cfg, arg);
+ int new_diff = validator->checks[i](curve, cfg, arg);
if (new_diff <= 0) {
diff = new_diff;
break;
@@ -271,12 +274,15 @@ static void exhaustive_init(exhaustive_t *setup, const config_t *cfg) {
anomalous_init();
}
-static void exhaustive_quit(arg_t *argss[]) {
+static void exhaustive_quit(exhaustive_t *setup) {
equation_quit();
anomalous_quit();
for (size_t i = 0; i < OFFSET_END; ++i) {
- if (argss[i]) {
- arg_free(&(argss[i]));
+ if (setup->argss[i]) {
+ arg_free(&(setup->argss[i]));
+ }
+ if (setup->validators[i]) {
+ check_free(&(setup->validators[i]));
}
}
}
@@ -313,7 +319,7 @@ int exhaustive_do(config_t *cfg) {
}
output_o_end(cfg);
- exhaustive_quit(setup.argss);
+ exhaustive_quit(&setup);
debug_log_end("Finished Exhaustive method");
return EXIT_SUCCESS;
}
diff --git a/src/gen/curve.c b/src/gen/curve.c
index 62c8fa3..55fdb3f 100644
--- a/src/gen/curve.c
+++ b/src/gen/curve.c
@@ -116,14 +116,8 @@ GENERATOR(curve_gen_any) {
}
}
-GENERATOR(curve_gen_nonzero) {
- pari_sp ltop = avma;
- int any = curve_gen_any(curve, cfg, args);
- if (any <= 0) {
- return any;
- }
+CHECK(curve_check_nonzero) {
if (gequal0(ell_get_disc(curve->curve))) {
- avma = ltop;
return -3;
} else {
return 1;
diff --git a/src/gen/curve.h b/src/gen/curve.h
index 7694078..1bff19a 100644
--- a/src/gen/curve.h
+++ b/src/gen/curve.h
@@ -24,16 +24,15 @@
GENERATOR(curve_gen_any);
/**
- * GENERATOR(gen_f)
- * Creates a curve GEN in curve_t curve from field, a and b.
- * Succeeds if a curve exists(non-zero discriminant).
+ * CHECK(check_f)
+ * Checks that the curve has non-zero discriminant.
*
- * @param curve A curve_t being generated
- * @param cfg An application config
- * @param args unused
- * @return state diff
+ * @param curve
+ * @param cfg
+ * @param args
+ * @return
*/
-GENERATOR(curve_gen_nonzero);
+CHECK(curve_check_nonzero);
/**
*
diff --git a/src/invalid/invalid.c b/src/invalid/invalid.c
index 34d7667..c3abbc7 100644
--- a/src/invalid/invalid.c
+++ b/src/invalid/invalid.c
@@ -3,7 +3,7 @@
* Copyright (C) 2017 J08nY
*/
#include "invalid.h"
-#include <exhaustive/exhaustive.h>
+#include "exhaustive/check.h"
#include "exhaustive/exhaustive.h"
#include "gen/curve.h"
#include "gen/equation.h"
@@ -27,7 +27,7 @@ static void invalid_original_ginit(gen_f *generators, const config_t *cfg) {
generators[OFFSET_B] = &b_gen_input;
}
generators[OFFSET_GENERATORS] = &gens_gen_any;
- generators[OFFSET_CURVE] = &curve_gen_nonzero;
+ generators[OFFSET_CURVE] = &curve_gen_any;
generators[OFFSET_ORDER] = &order_gen_any;
}
@@ -36,7 +36,7 @@ static void invalid_invalid_ginit(gen_f *generators, const config_t *cfg) {
generators[OFFSET_FIELD] = &gen_skip;
generators[OFFSET_A] = &gen_skip;
generators[OFFSET_B] = &b_gen_random;
- generators[OFFSET_CURVE] = &curve_gen_nonzero;
+ generators[OFFSET_CURVE] = &curve_gen_any;
generators[OFFSET_ORDER] = &order_gen_any;
if (cfg->unique) {
generators[OFFSET_GENERATORS] = &gens_gen_one;
@@ -46,6 +46,11 @@ static void invalid_invalid_ginit(gen_f *generators, const config_t *cfg) {
generators[OFFSET_POINTS] = &points_gen_trial;
}
+static void invalid_cinit(check_t **validators, const config_t *cfg) {
+ check_t *curve_check = check_new(curve_check_nonzero, NULL);
+ validators[OFFSET_CURVE] = curve_check;
+}
+
static size_t invalid_primes(GEN order, pari_ulong **primes) {
pari_sp ltop = avma;
@@ -277,13 +282,15 @@ static size_t invalid_curves_threaded(const curve_t *curve, const config_t *cfg,
int invalid_do(config_t *cfg) {
debug_log_start("Starting Invalid curve method");
- gen_f original_gens[OFFSET_END];
- arg_t *original_argss[OFFSET_END];
- unroll_f common_unrolls[OFFSET_END];
+ gen_f original_gens[OFFSET_END] = {NULL};
+ check_t *common_validators[OFFSET_END] = {NULL};
+ arg_t *original_argss[OFFSET_END] = {NULL};
+ unroll_f common_unrolls[OFFSET_END] = {NULL};
invalid_original_ginit(original_gens, cfg);
+ invalid_cinit(common_validators, cfg);
exhaustive_uinit(common_unrolls, cfg);
exhaustive_t original_setup = {.generators = original_gens,
- .validators = NULL,
+ .validators = common_validators,
.argss = original_argss,
.unrolls = common_unrolls};
@@ -313,7 +320,7 @@ int invalid_do(config_t *cfg) {
gen_f invalid_gens[OFFSET_END];
invalid_invalid_ginit(invalid_gens, cfg);
exhaustive_t invalid_setup = {.generators = invalid_gens,
- .validators = NULL,
+ .validators = common_validators,
.argss = NULL,
.unrolls = common_unrolls};