aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJ08nY2017-10-17 00:16:37 +0200
committerJ08nY2017-10-17 00:16:37 +0200
commit5307f9318a01ed29a11202ad0915efae9dec44d0 (patch)
treef3a0aad1773e954ee15d3a6fef24a742d65d929e /src
parent029ae4d5e19a69e22272755febb8825402594cc7 (diff)
downloadecgen-5307f9318a01ed29a11202ad0915efae9dec44d0.tar.gz
ecgen-5307f9318a01ed29a11202ad0915efae9dec44d0.tar.zst
ecgen-5307f9318a01ed29a11202ad0915efae9dec44d0.zip
Diffstat (limited to 'src')
-rw-r--r--src/exhaustive/arg.h1
-rw-r--r--src/gen/gens.c40
-rw-r--r--src/gen/gens.h18
-rw-r--r--src/gen/order.c63
-rw-r--r--src/gen/order.h24
5 files changed, 144 insertions, 2 deletions
diff --git a/src/exhaustive/arg.h b/src/exhaustive/arg.h
index 0b10715..62cafd0 100644
--- a/src/exhaustive/arg.h
+++ b/src/exhaustive/arg.h
@@ -8,6 +8,7 @@
#ifndef ECGEN_ARG_H
#define ECGEN_ARG_H
+#include "io/output.h"
#include "misc/types.h"
#define HAS_ARG(args) \
diff --git a/src/gen/gens.c b/src/gen/gens.c
index f5f9fcb..d40de67 100644
--- a/src/gen/gens.c
+++ b/src/gen/gens.c
@@ -3,6 +3,8 @@
* Copyright (C) 2017 J08nY
*/
#include "gens.h"
+#include <misc/types.h>
+#include "exhaustive/arg.h"
#include "point.h"
static int gens_put(curve_t *curve, GEN generators, long len) {
@@ -37,6 +39,44 @@ GENERATOR(gens_gen_one) {
return gens_put(curve, generators, len);
}
+CHECK(gens_check_anomalous) {
+ if (cfg->field == FIELD_BINARY) return 1;
+ pari_sp ltop = avma;
+ for (size_t i = 0; i < curve->ngens; ++i) {
+ if (mpcmp(curve->field, curve->generators[i]->order) == 0) {
+ avma = ltop;
+ return -5;
+ }
+ }
+ return 1;
+}
+
+CHECK(gens_check_embedding) {
+ HAS_ARG(args);
+ if (cfg->field == FIELD_BINARY) return 1;
+ pari_sp ltop = avma;
+
+ const char *min_degree = args->args;
+ GEN mind = strtoi(min_degree);
+
+ for (size_t i = 0; i < curve->ngens; ++i) {
+ GEN power = gen_0;
+ GEN pm;
+ do {
+ power = addii(power, gen_1);
+ GEN ppow = powii(curve->field, power);
+ pm = subii(ppow, gen_1);
+ } while (!dvdii(pm, curve->generators[i]->order));
+
+ if (mpcmp(power, mind) <= 0) {
+ avma = ltop;
+ return -5;
+ }
+ }
+ avma = ltop;
+ return 1;
+}
+
UNROLL(gens_unroll) {
if (curve->generators) {
points_free_deep(&curve->generators, curve->ngens);
diff --git a/src/gen/gens.h b/src/gen/gens.h
index ace1a88..18c9815 100644
--- a/src/gen/gens.h
+++ b/src/gen/gens.h
@@ -30,6 +30,24 @@ GENERATOR(gens_gen_any);
GENERATOR(gens_gen_one);
/**
+ *
+ * @param curve
+ * @param args
+ * @param state
+ * @return
+ */
+CHECK(gens_check_anomalous);
+
+/**
+ *
+ * @param curve
+ * @param args
+ * @param state
+ * @return
+ */
+CHECK(gens_check_embedding);
+
+/**
* UNROLL(unroll_f)
*
* @param curve
diff --git a/src/gen/order.c b/src/gen/order.c
index 1ad7a93..92b1489 100644
--- a/src/gen/order.c
+++ b/src/gen/order.c
@@ -3,9 +3,9 @@
* Copyright (C) 2017 J08nY
*/
#include "order.h"
+#include <misc/types.h>
#include "exhaustive/arg.h"
#include "io/input.h"
-#include "io/output.h"
GENERATOR(order_gen_input) {
pari_sp ltop = avma;
@@ -92,3 +92,64 @@ GENERATOR(order_gen_prime) {
return 1;
}
}
+
+CHECK(order_check_pohlig_hellman) {
+ HAS_ARG(args);
+ pari_sp ltop = avma;
+
+ const char *min_fact = args->args;
+ GEN minf = strtoi(min_fact);
+
+ GEN factors = factor(curve->order);
+ GEN primes = gel(factors, 1);
+
+ long len = glength(primes);
+ if (mpcmp(gel(primes, len), minf) <= 0) {
+ avma = ltop;
+ return -4;
+ } else {
+ avma = ltop;
+ return 1;
+ }
+}
+
+CHECK(order_check_discriminant) {
+ HAS_ARG(args);
+ if (cfg->field == FIELD_BINARY) return 1;
+ pari_sp ltop = avma;
+
+ const char *min_disc = args->args;
+ GEN mind = strtoi(min_disc);
+
+ GEN t = negi(subii(curve->order, addii(curve->field, gen_1)));
+ GEN tp = subii(sqri(t), mulis(curve->field, 4));
+ GEN tp_factors = factor(tp);
+
+ GEN tp_primes = gel(tp_factors, 1);
+ GEN tp_pows = gel(tp_factors, 2);
+ long tp_pow_len = glength(tp_pows);
+ GEN max_value = gen_1;
+ for (long i = 1; i <= tp_pow_len; ++i) {
+ if (!dvdis(gel(tp_pows, i), 2)) {
+ continue;
+ }
+
+ GEN value = powii(gel(tp_primes, i), gel(tp_pows, i));
+ if (mpcmp(max_value, value) < 0) {
+ max_value = value;
+ }
+ }
+ GEN s = max_value;
+
+ GEN D = divii(tp, s);
+ if (mod4(D) != 1) {
+ D = mulis(D, 4);
+ }
+
+ if (mpcmp(D, mind) <= 0) {
+ avma = ltop;
+ return -4;
+ }
+ avma = ltop;
+ return 1;
+} \ No newline at end of file
diff --git a/src/gen/order.h b/src/gen/order.h
index da06de5..bd1a204 100644
--- a/src/gen/order.h
+++ b/src/gen/order.h
@@ -16,7 +16,7 @@
*
* @param curve A curve_t being generated
* @param args Current optional generator argument
- * @return state diff
+ * @param state
* @return state diff
*/
GENERATOR(order_gen_input);
@@ -28,6 +28,7 @@ GENERATOR(order_gen_input);
*
* @param curve A curve_t being generated
* @param args Current optional generator argument
+ * @param state
* @return state diff
*/
GENERATOR(order_gen_any);
@@ -38,6 +39,7 @@ GENERATOR(order_gen_any);
*
* @param curve A curve_t being generated
* @param args unused
+ * @param state
* @return state diff
*/
GENERATOR(order_gen_sea);
@@ -47,6 +49,7 @@ GENERATOR(order_gen_sea);
*
* @param curve A curve_t being generated
* @param args pari_ulong passed to ellsea(curve, smallfact)
+ * @param state
* @return state diff
*/
GENERATOR(order_gen_smallfact);
@@ -59,8 +62,27 @@ GENERATOR(order_gen_smallfact);
*
* @param curve A curve_t being generated
* @param args unused
+ * @param state
* @return state diff
*/
GENERATOR(order_gen_prime);
+/**
+ *
+ * @param curve
+ * @param args
+ * @param state
+ * @return
+ */
+CHECK(order_check_pohlig_hellman);
+
+/**
+ *
+ * @param curve
+ * @param args
+ * @param state
+ * @return
+ */
+CHECK(order_check_discriminant);
+
#endif // ECGEN_ORDER_H